周纯葆 中国科学院计算机网络信息中心 超级计算中心

Slides:



Advertisements
Similar presentations
南山中學 102學年度 性別平等教育週性別教育 性騷擾防治.
Advertisements

赵永华 中科院计算机网络信息中心 超级计算中心
郎显宇 中国科学院计算机网络信息中心 超级计算中心
Loops.
第一章 C语言概述 计算机公共教学部.
資料庫設計 Database Design.
第二章 基本程式設計.
数字系统设计及VHDL实践 专题五 专用集成电路 设计中的并行算法 主 讲 人:徐向民 单 位:电子信息学院.
机群应用开发 并行编程原理及 程序设计 Parallel Programming: Fundamentals and Implementation 曙光信息产业有限公司 2017年9月 2017年9月 MPI并行程序设计.
预测股市将不涨,可亮出卖出认购期权(Short Call) 招数,获得权利金,增加收益,持股者也可使出此招,为股票锁定卖出价。这一剑法在到期日股价低于行权价格时,能获得全部权利金收入。
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
Tree(樹) 什麼是「樹」? 「樹」的範例 「樹」的定義 「樹」的表示法.
TOP100 案例标题 徐华海 架构师 当当.
Operating System Concepts 作業系統原理 Chapter 3 行程觀念 (Process Concept)
MPI并行程序设计简介 曙光信息产业(北京)有限公司 2018年11月.
第二章 C# 基础知识.
并行算法实践.
消息传递并行编程环境 王彦棡 2010年5月.
周纯葆 中国科学院计算机网络信息中心 超级计算中心
并行编程原理及 程序设计 Parallel Programming: Fundamentals and Implementation
C++程序设计 第二讲 清华大学软件学院.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第3章 變數、資料型別與運算子.
机群应用开发 并行编程原理及 程序设计 Parallel Programming: Fundamentals and Implementation 曙光信息产业股份有限公司 解决方案中心 高性能计算方案部 年11月.
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
MPI并行编程      报告人:李俊照.
實作輔導 日期: 3/11 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
C 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
系統與網路管理工具.
第四讲 MPI并行程序设计 课程网站:CourseGrading buaa.edu.cn 主讲教师: 赵长海
并行计算.
并行算法实践 上篇 并行程序设计导论.
VHDL 硬體描述語言 數位電路設計實務 第六章 函數副程序以及套件程式庫.
基于MPI的并行程序设计 王振海 西北工业大学理学院 西北工业大学高性能计算研究与发展中心 2018/11/28.
Chapter 3 行程觀念 (Process Concept)
欢迎参加VHDL培训 VHDL培训教程 浙江大学电子信息技术研究所 电子设计自动化(EDA)培训中心
C++ 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第三章 C++中的C 面向对象程序设计(C++).
第十三章 其他的C語言課題.
第3章 變數、常數與資料型態 3-1 C語言的識別字 3-2 變數的宣告與初值 3-3 指定敘述 3-4 C語言的資料型態
Chapter 2 Basic Elements of Fortran
第3章 變數、資料型別與運算子 3-1 變數與資料型別的基礎 3-2 變數的命名與宣告 3-3 資料型別 3-4 運算式與運算子
變數命名 保留字(Reserved Word)
重點 資料結構之選定會影響演算法 選擇對的資料結構讓您上天堂 程式.
Ch9 Communicating with Hardware
第4章 常量和变量 常量和变量都是程序中预留的用于保存数据的内存空间。常量的值在程序运行过程中始终不会发生变化。而变量的值在程序的运行过程中是可以变化的。在Fortran语言中,有五种基本的数据类型可供使用。他们分别是整型(INTEGER)、实型(REAL)、复型(COMPLEX)、字符型(CHARACTER)和逻辑型(LOGICAL)。按用途,又可以分数值型、字符型和逻辑型三种。相应的常量和变量也可以分为这三种。本章将按照用途介绍常量和变量的基本概念。
并行计算简介 高性能事业部:曹振南 年4月.
明解C++教學手冊 柴田望洋 博士 著 書號:PG20269
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
進階 WWW 程式設計 -- PHP 語言結構 靜宜大學資訊管理學系 蔡奇偉副教授 2003
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第一次上机安排 第六周 第七周 周一晚(提高1、2,通信001~012) 周二上(通信014~085) 周四上(通信086~154)
實作輔導 2 日期: 3/24(星期六) 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
C语言概述 第一章.
数据块中的数据存储 目录 页 目标 …… 数据存储区 … ……… 数据块 (DB) … STEP 7数据类型概述 STEP 7基本数据类型
Speaker: Liu Yu-Jiun Date: 2009/4/29
Java變數 2014/6/24.
中国科学技术大学计算机系 陈香兰 2013Fall 第七讲 存储器管理 中国科学技术大学计算机系 陈香兰 2013Fall.
ARM Developer Suite 介 绍.
OpenMP程序设计 2019/4/25.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 类型、对象、运算符和表达式.
第二章 基本数据类型 ——数据的表示.
第六章 类属B树索引技术 对基于树的索引方法给出一种通用算法。该算法是建立在类属B树的概念之上开发的。它将类型系统开放,使系统能支持用户自定义的数据类型、函数和某些特殊的查询谓词的集合。并且,将新的数据类型、函数、查询谓词等登记到数据库管理系统中,
Ch07. 函式.
第十二章 位运算.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
變數、資料型態、運算子.
Fortran 实用编程 系列视频教程 Fortran Coder 研讨团队
Presentation transcript:

周纯葆 中国科学院计算机网络信息中心 超级计算中心 zhoucb@sccas.cn MPI并行编程 周纯葆 中国科学院计算机网络信息中心 超级计算中心 zhoucb@sccas.cn

目录 并行计算与MPI MPI环境管理函数 MPI点对点通讯函数 MPI集合通讯函数 MPI自定义数据类型 MPI进程组与通讯器

并行计算与MPI 串行计算 并行计算 传统程序都是进行串行计算的。一个问题被分为一系列离散的指令;指令之间都是顺序执行的;只能运行在一个处理器上;在同一时刻,只能有一条指令在执行。 并行计算是利用多个处理器资源来进行计算的。问题被分为多个独立的,可以同时进行计算的部分;每个计算部分进一步被分为一系列指令;不同计算部分的执行可以在不同的处理器上同时进行执行;

并行计算与MPI 为什么要用到并行计算呢,主要是两方面的考虑,第一是减少计算时间,第二是增加计算规模。 并行计算三个基本条件:并行机器,并行算法,并行编程。

并行计算与MPI 共享存储 均匀访存(UMA:Uniform Memory Access) 内存与结点分离,存储为所有结点共享 所有结点任意访问存储单元,且时间相同 访存竞争时,仲裁策略平等对待每个处理器 各处理器带有局部高速缓存cache 单一的操作系统映象 对称多处理共享存储并行机 SMP

并行计算与MPI 共享存储 非均匀访存(NUMA: Non-uniform Memory Access) 内存模块局部在各个结点内,所有局部内存构成全局内存 所有结点任意访问各存储单元,但速度和时间不等 访存竞争时,仲裁策略对待每个处理器可能不等价 各处理器带有局部高速缓存cache,以及保持缓存一致性的协议,此又称cache一致性的非均匀存储——ccNUMA 单一操作系统映象 分布共享存储并行机 DSM

并行计算与MPI 分布式存储 内存模块物理分布同前,每个结点拥有局部内存模块 各结点存储模块只能被局部CPU访问 访问其他结点内存,可通过消息传递实现 各结点拥有不同的操作系统映象 结点内和结点间的互连通常都有特殊的技术来提高通讯速度,其操作系统不是开放的,而是制造者专有 大规模并行机MPP

并行计算与MPI 混和存储 结点内部是共享存储模型 结点间是分布式存储模型 各结点拥有不同的操作系统映象 深腾7000

并行计算与MPI OPENMP MPI 共享存储环境:通过读写操作系统提供的共享数据缓存。 分布存储网络环境中:通过socket网络通讯来完成。 MPI

使用进程的地址空间,有私有栈,各线程栈不相交 并行计算与MPI 进程与线程 线程 操作系统调度执行的最小单位 继承 执行特征 比喻为苦力 属于某个进程 使用进程的地址空间,有私有栈,各线程栈不相交 进程 操作系统资源分配的最小单位 资源特征 + 执行特征 比喻为管家 至少包含一个线程 拥有自己的地址空间 资源特征:程序执行所需要的计算资源。 执行特征:进程执行过程中动态改变的特征。 如果要生成子进程就要复制资源特征和执行特征,而线程是共享资源特征的,只复制执行特征即可。

并行计算与MPI MPI (Message Passing Interface) 是函数库规范,而不是并行语言;操作如同库函数调用 是一种标准和规范,而非某个对它的具体实现(MPICH等),与编程语言无关 是一种消息传递编程模型,并成为这类编程模型的代表 What is the message? DATA+ENVELOPE

并行计算与MPI Inscribe a circle in a square Randomly generate points in the square Determine the number of points in the square that are also in the circle Let r be the number of points in the circle divided by the number of points in the square PI ~ 4 r Note that the more points generated, the better the approximation

并行计算与MPI

并行计算与MPI

并行计算与MPI

并行计算与MPI 头文件: MPI函数调用: C include file Fortran include file #include "mpi.h" include 'mpif.h' C Binding Format: rc = MPI_Xxxxx(parameter, ... ) Example: rc = MPI_Bsend(&buf,count,type,dest,tag,comm) Error code: Returned as "rc". MPI_SUCCESS if successful Fortran Binding Format: CALL MPI_XXXXX(parameter,..., ierr) call mpi_xxxxx(parameter,..., ierr) Example: CALL MPI_BSEND(buf,count,type,dest,tag,comm,ierr) Error code: Returned as "ierr" parameter. MPI_SUCCESS if successful

并行计算与MPI MPI进程组和通讯器: MPI利用进程组和通讯器来定义相互通讯的进程集合。 大多数MPI函数都需要指定一个通讯器作为参数。 MPI预定义的通讯器MPI_COMM_WORLD包含所有的MPI进程。

MPI环境管理函数 MPI_Init 初始化 MPI执行环境。该函数为每个MPI程序都需要调用的MPI函数,且为第一个调用的MPI函数(除 MPI_Initialized 外)。该函数只能调用一次。

MPI环境管理函数 MPI_Comm_size 获取指定通信器中MPI进程总数,例如MPI_COMM_WORLD 。如果通讯器为MPI_COMM_WORLD,该函数获取程序可用的MPI进程总数。

MPI环境管理函数 MPI_Comm_rank 获取指定通信器中调用该函数的MPI进程对应的标号。最初通讯器MPI_COMM_WORLD中的每个进程都被指定了一个唯一的整数标号,范围为0到进程总数减一。这个标号通常作为进程号。如果一个进程关联了其他通讯器,每个通讯器中都有该进程对应的唯一标号。

MPI环境管理函数 MPI_Abort 终止通讯器中所有MPI进程。在出现了致命错误而希望异常终止MPI程序时执行。MPI系统会设法终止指定通信器中所有进程,进程错误码返回给系统。 comm=MPI_COMM_WORLD,全部进程退出。 comm≠MPI_COMM_WORLD,comm包含的进程退出,其他进程是否退出取决于具体MPI实现。

MPI环境管理函数 MPI_Get_processor_name 获取处理器名称和名称长度。Name长度一般可以设置为MPI_MAX_PROCESSOR_NAME。

MPI环境管理函数 MPI_Get_version 获取MPI版本信息。

MPI环境管理函数 MPI_Initialized 查询MPI是否已经初始化。唯一可在 MPI_Init 之前调用的MPI函数,如果已经调用了MPI_Init函数,返回flag=true,否则flag=false。

MPI环境管理函数 MPI_Wtime 获取调用该函数进程所经历的墙上时钟时间(秒,双精度)。

MPI环境管理函数 MPI_Wtick 获取MPI_Wtime的最小时间刻度(秒,双精度)。

MPI环境管理函数 MPI_Finalize 终止MPI执行环境。该函数是MPI程序中最后调用的MPI函数。

MPI环境管理函数 C:

MPI环境管理函数 Fortran:

MPI环境管理函数 MPI程序编译与运行 程序编译 C: mpicc -o mpiprog mpisrc.c Fortran 77: mpif77 -o mpiprog mpisrc.f 程序运行 mpirun -np 4 mpiprog

MPI环境管理函数 单处理器 (tp5) 运行4个进程 4个处理器 (tp1, tp2, tp3, tp4) 分别运行4个进程

MPI环境管理函数

MPI点对点通讯函数 两个进程之间的通信 源进程发送消息到目标进程 目标进程接收消息 通信发生在同一个通信器内 进程通过其在通信器内的标号表示 1 2 3 4 5 destination source communicator

MPI点对点通讯函数 MPI点对点通讯函数的类型: 消息发送和接收函数包含很多不同的类型: Synchronous send Blocking send / blocking receive Non-blocking send / non-blocking receive Buffered send Combined send/receive "Ready" send 任何类型消息发送函数都能与任何类型的消息接收函数进行配对使用。 MPI同时提供了几个与发送和接收操作相关的函数,包括用于等待消息到达的函数,检测消息是否到达的函数。

MPI点对点通讯函数 消息(message) 数据:<起始地址,数据个数,数据类型> 信封:<源/目,标识,通讯域> MPI_Send (buffer, count, type, dest, tag, comm) 数据 信封 MPI_Recv (buffer, count, type, source, tag, comm, status) 数据 信封

MPI点对点通讯函数 MPI消息传递函数的参数: 1. Buffer 程序中指向待发送或接收数据的地址空间。大多数情况下就是待发送或接收的变量名字。对于C语言程序,这个参数是变量的引用,并且一定要在变量名字前面要有&号。 2. Data Count 指示待传递的特定数据类型数据的个数。

MPI点对点通讯函数 3. Data Type MPI预定义的基本数据类型。 C Data Types Fortran Data Types MPI_CHAR signed char MPI_CHARACTER character MPI_SHORT signed short int MPI_INT signed int MPI_INTEGER integer MPI_LONG signed long int MPI_UNSIGNED_CHAR unsigned char MPI_UNSIGNED_SHORT unsigned short int MPI_UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long int MPI_FLOAT float MPI_REAL real MPI_DOUBLE double MPI_DOUBLE_PRECISION double precision MPI_LONG_DOUBLE long double MPI_BYTE 8 binary digits MPI_PACKED MPI_Pack()

MPI点对点通讯函数 4. Destination MPI中消息发送函数中用于指示消息传递目的地的参数。实质是消息接收进程的进程号。 5. Source MPI中消息接收函数中用于指示消息传递来源的参数。实质是消息发送进程的进程号。可以是MPI_ANY_SOURCE,表示接收任意来源的消息。 6. Tag 人为指定的任意非负整数,用于区分不同的消息。消息发送和接收函数要对匹配的消息进行操作。对于消息接收函数,可以是MPI_ANY_TAG,表示接收任意的消息。MPI标准中0-32767可以被用作标记,具体的实现可以超过这个范围。

MPI点对点通讯函数 7. Communicator 用于指示通讯上下文或消息来源和目的所在进程的集合。除非人为建立新的通讯器,否则预定义的通讯上下文是MPI_COMM_WORLD 。 8. Status 对于消息接收函数,用于指示消息来源和消息标记的参数。 9. Request 用于非阻塞消息发送和接收函数。由于非阻塞MPI函数可能在获得系统缓存之前返回,所以系统给每一个非阻塞MPI函数一个唯一的标记。这个标记用于后面对于非阻塞消息传递的完成状态 。C语言中,这个参数是指向预定义结构体MPI_Request的指针。Fortran语言中,这个参数是一个整数。

MPI点对点通讯函数 在C 语言中, 状态是MPI_Status 类型的一种结构, 它包含MPI_SOURCE、MPI_TAG和MPI_ERROR 3个字段;这种结构还可以包含不同的字段。 status.MPI_SOURCE 发送数据的进程标识 status.MPI_TAG 发送数据的消息标识 status.MPI_ERROR 接收操作返回的错误代码 在Fortran语言中,状态是长度为MPI_STATUS_SIZE的一个整型数组。MPI_SOURCE、MPI_TAG和MPI_ERROR 3个常数是存储源、标志和错误字段项的系数。 status(MPI_SOURCE) 发送数据的进程标识 status(MPI_TAG ) 发送数据的消息标识 status(MPI_ERROR) 接收操作返回的错误代码

MPI点对点通讯函数 阻塞式与非阻塞通讯 通信类型 函数返回 对数据区操作 特性 阻塞式通信 1.阻塞型函数需要等待指定操作完成返回 函数返回后,对数据区操作是安全的 1.程序设计相对简单 2.使用不当容易造成死锁 非阻塞式通信 1.调用后立刻返回,实际操作在MPI后台执行 2.需调用函数等待或查询操作的完成情况 函数返回后,即操作数据区不安全。可能与后台正进行的操作冲突 1.可以实现计算与通信的重叠 2.程序设计相对复杂

MPI点对点通讯函数 系统缓存:

MPI点对点通讯函数 标准阻塞式通讯 是否对发送数据进行缓存,由MPI系统决定,而非程序员 阻塞:发送成功,意味(1)消息成功发送;(2)或者消息被缓存 接收成功,意味消息已被成功接收

MPI点对点通讯函数 R S 阻塞(标准)发送函数,MPI_Send。 阻塞(标准)接收函数,MPI_Recv。 非阻塞(标准)发送函数,MPI_Isend。 非阻塞(标准)接收函数,MPI_Irecv。 R S 1

MPI点对点通讯函数 R S 阻塞缓存发送函数,MPI_Bsend。 非阻塞缓存发送函数,MPI_Ibsend。 1 2 缓存 消息发送函数可以被局部地提交和完成,与相匹配的消息接收函数是否存在没有任何关系。 2 缓存

MPI点对点通讯函数 R S 阻塞同步发送函数,MPI_Ssend。 非阻塞同步发送函数,MPI_Issend 。 1 2 3 类似于电话协议,直到消息接收函数被提交,两个通讯进程取得联系之后,消息才开始发送,且直到消息开始接收消息发送函数才能返回。

MPI点对点通讯函数 R S 阻塞就绪发送函数,MPI_Rsend。 非阻塞就绪发送函数,MPI_Irsend。 1 2 提交消息发送函数之前,先提交与之匹配的消息接收函数,且直到消息被写入消息接收缓存后,消息发送函数才返回。 如果消息发送函数提交后,与之匹配的消息接收函数没有提交,则消息发送可能不正确,因此必须由用户来组织并行程序保证,MPI不提供任何帮助。

MPI点对点通讯函数 标准模式: MPI_Send 消息发送函数,执行一个标准模式的阻塞式消息发送通讯操作。 MPI_Send (buf, count, datatype, dest, tag, comm) IN buf 发送缓存的起始地址 IN count 发送缓存中数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标志 IN comm 通讯器

MPI点对点通讯函数

MPI点对点通讯函数 标准模式: MPI_Recv 消息接收函数,执行一个标准模式的阻塞式消息接收通讯操作。 MPI_Recv (buf, count, datatype, dest, tag, comm, status) OUT buf 接收缓存的起始地址 IN count 接收缓存允许最大数据单元个数 IN datatype 数据单元类型 IN source 发送进程号 IN tag 消息标志 IN comm 通讯器 OUT status 接收返回状态信息

MPI点对点通讯函数

MPI点对点通讯函数 Send返还时,第一,发送的消息被拷贝给MPI缓存,一旦MPI成功缓存了该消息,函数返回,消息传递由MPI来完成。第二,MPI不提供对消息的缓存,只有当接收该消息的基恩成执行相匹配的的消息接收操作,该消息由MPI吸入消息接收缓存中,直到消息全部写入,函数返回。 Recv返回时,如果接收的消息在MPI缓存中,则立即接收该消息,并将其写入消息接收缓存后,函数返回。如果接收的消息寒没有提交给MPI,则必须阻塞等待消息发送,知道接收到该消息后,函数返回。 接收缓存可大。

MPI点对点通讯函数 MPI_Sendrecv 消息发收函数,同时执行一个阻塞式消息发送和接收通讯操作。 MPI_Sendrecv (sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, recvcount, recvtype, source, recvtag, comm, status) IN sendbuf 发送缓存的起始地址 IN sendcount 发送的数据单元个数 IN sendtype 发送的数据单元类型 IN dest 接收进程号 IN sendtag 发送消息标志 OUT recvbuf 接收缓存的起始地址 IN recvcount 接收的数据单元个数 IN recvtype 接收的数据单元类型 IN source 发送进程号 IN recvtag 接收消息标志 IN comm 通讯器 OUT status 接收返回状态信息 同时执行两个MPI函数,阻塞消息发送和阻塞消息接收,两个函数执行完毕,函数返回。 消息发送和消息接收缓存必须互不相交。

MPI点对点通讯函数

MPI点对点通讯函数 MPI_Sendrecv_replace 消息发收替换函数,同时执行一个阻塞式消息发送和接收通讯操作,并用接收的消息覆盖缓存中的内容。 MPI_Sendrecv_replace (buf, count, datatype, dest, sendtag, source, recvtag, comm, status) IN buf 消息(发送/接收)缓存的起始地址 IN count 消息(发送/接收)缓存数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN sendtag 发送消息标志 IN source 发送进程号 IN recvtag 接收消息标志 IN comm 通讯器 OUT status 接收返回状态信息

MPI点对点通讯函数

MPI点对点通讯函数 MPI_Get_count 消息长度查询函数,返回消息包含的数据单元个数。 MPI_Get_count (status, datatype, count) IN status 消息接收函数返回的状态信息 IN datatype 消息中数据单元类型 OUT count 消息包含的数据单元个数

MPI点对点通讯函数 标准模式: MPI_Isend 标准模式非阻塞消息发送函数,提交一个非阻塞消息发送操作。 MPI_Isend (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的起始地址 IN count 发送缓存中数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标志 IN comm 通讯器 OUT request 通讯请求

MPI点对点通讯函数

MPI点对点通讯函数 标准模式: MPI_Irecv 标准模式非阻塞消息接收函数,提交一个非阻塞消息接收操作。 MPI_Irecv (buf, count, datatype, source, tag, comm, request) OUT buf 接收缓存的起始地址 IN count 接收缓存的数据单元个数 IN datatype 数据单元类型 IN source 发送进程号 IN tag 消息标志 IN comm 通讯器 OUT request 通讯请求

MPI点对点通讯函数

MPI点对点通讯函数 Isend返回时,表明MPI已经开始从消息发送缓存中拷贝数据,但是并不隐含消息拷贝已完成。修改消息发送缓存,不安全。 Irecv返回时,第一,如果接收的消息不在MPI中,则函数立即返回。第二,如果接收的消息已经存在于MPI中,则函数接收该消息,并将消息写入消息接收缓存后返回。修改消息接收缓存,不安全。

MPI点对点通讯函数 MPI_Wait 非阻塞通讯完成函数,确保与某个通讯请求相关联的非阻塞通讯操作安全完成。 MPI_Wait (request, status) INOUT request 通讯请求 OUT status 接收返回状态信息

MPI点对点通讯函数 MPI_Waitany 非阻塞通讯完成函数,确保至少存在一个与给定序列中某个通讯请求相关联的非阻塞通讯操作安全完成。 MPI_Waitany (count, array_of_requests, index, status) IN count 通信请求序列包含的通信请求 个数 INOUT array_of_requests 通讯请求序列 OUT index 完成的通讯请求在序列中位置 OUT status 接收返回状态信息

MPI点对点通讯函数

MPI点对点通讯函数 MPI_Waitall 非阻塞通讯完成函数,确保与给定序列中所有通讯请求各自相关联的非阻塞通讯操作全部安全完成。 MPI_Waitall (count, array_of_requests, array_of_statuses) IN count 通信请求序列包含的通信请求 个数 INOUT array_of_requests 通讯请求序列 OUT array_of_statuses 接收返回状态信息序列

MPI点对点通讯函数

MPI点对点通讯函数 MPI_Waitsome 非阻塞通讯完成函数,确保与给定序列中某些通讯请求各自相关联的非阻塞通讯操作安全完成。 MPI_Waitsome (incount, array_of_requests, outcount, array_of_indices, array_of_statuses) IN incount 通信请求序列包含的通信请求 个数 INOUT array_of_requests 通讯请求序列 OUT outcount 序列中已完成的通讯请求个数 OUT araay_of_indices 完成的通讯请求在序列中位置 OUT array_of_statuses 接收返回状态信息序列

MPI点对点通讯函数

MPI点对点通讯函数 MPI_Test 非阻塞通讯完成查询函数,查询某个通讯请求相关联的非阻塞通讯操作是否安全完成。 MPI_Test (request, flag, status) INOUT request 通讯请求 OUT flag ture表示该通讯请求已完成 OUT status 接收返回状态信息

MPI点对点通讯函数 MPI_Testany 非阻塞通讯完成查询函数,查询是否至少存在一个与给定序列中某个通讯请求相关联的非阻塞通讯操作已经安全完成。 MPI_Testany (count, array_of_requests, index, flag, status) IN count 通信请求序列包含的通信请求 个数 INOUT array_of_requests 通讯请求序列 OUT index 已完成的通信请求在序列中的 位置 OUT flag ture表示该通讯请求已完成 OUT status 接收返回状态信息

MPI点对点通讯函数

MPI点对点通讯函数 MPI_Testall 非阻塞通讯完成查询函数,查询给定序列中所有通讯请求各自相关联的非阻塞通讯操作是否已经全部安全完成。 MPI_Testall (count, array_of_requests, flag, array_of_statuses) IN count 通信请求序列包含的通信请求 个数 INOUT array_of_requests 通讯请求序列 OUT flag ture表示该通讯请求已完成 OUT array_of_statuses 接收返回状态信息序列

MPI点对点通讯函数

MPI点对点通讯函数 MPI_Testsome 非阻塞通讯完成查询函数,查询与给定序列中某些通讯请求各自相关联的非阻塞通讯操作是否已经安全完成。 MPI_Testsome (incount, array_of_requests, outcount, array_of_indices, array_of_statuses) IN incount 通信请求序列包含的通信请求 个数 INOUT array_of_requests 通讯请求序列 OUT outcount 序列中已完成的请求个数 OUT araay_of_indices 已完成的通讯请求在序列中的 位置 OUT array_of_statuses 接收返回状态信息序列

MPI点对点通讯函数

MPI点对点通讯函数 MPI_Probe 阻塞式消息查询函数,阻塞地查询某个特定消息是否已在MPI环境中 MPI_Probe (source, tag, comm, status) IN source 发送消息进程号 IN tag 消息标记 IN comm 通讯器 OUT status 接收返回状态信息

MPI点对点通讯函数

MPI点对点通讯函数 MPI_Iprobe 非阻塞式消息查询函数,非阻塞地查询某个特定消息是否已在MPI环境中。 MPI_Iprobe (source, tag, comm, flag, status) IN source 发送消息进程号 IN tag 消息标记 IN comm 通讯器 OUT flag ture表示消息已在MPI环境中 OUT status 接收返回状态

MPI点对点通讯函数

MPI点对点通讯函数 缓存模式: MPI_Bsend 缓存模式消息发送函数,执行一个缓存模式的阻塞式消息发送操作。 MPI_Bsend (buf, count, datatype, dest, tag, comm) IN buf 发送缓存的起始地址 IN count 发送缓存中的数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器

MPI点对点通讯函数

MPI点对点通讯函数

MPI点对点通讯函数 MPI_Buffer_attach 缓存提交函数。提交应用程序的内存空间给MPI系统用于缓存消息。 MPI_Buffer_attach (buffer, size) IN buffer 缓存起始地址 IN size 缓存大小(单位:字节) 提交的消息缓存要比实际将要发送的消息对,这些多余的空间被用于管理缓存。 一个进程只能定义一个缓存,也就是定义另一个缓存时必须释放前一个已经定义的缓存。

MPI点对点通讯函数 MPI_Buffer_detach 缓存释放函数。释放应用程序提交给MPI环境用于缓存消息的内存空间。 MPI_Buffer_detach (buffer, size) IN buffer 缓存起始地址 IN size 缓存大小(单位:字节)

MPI点对点通讯函数 缓存模式: MPI_Ibsend 缓存模式非阻塞消息发送函数,提交一个缓存模式非阻塞消息发送操作。 MPI_Ibsend (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 发送缓存中的数据单元个数 IN datatype 数据类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 通讯请求

MPI点对点通讯函数

MPI点对点通讯函数 同步模式: MPI_Ssend 同步模式消息发送函数,执行一个同步模式的阻塞式消息发送操作。 MPI_Ssend (buf, count, datatype, dest, tag, comm) IN buf 发送缓存的初始地址 IN count 发送缓存中的数据单元个数 IN datatype 数据类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器

MPI点对点通讯函数

MPI点对点通讯函数

MPI点对点通讯函数 同步模式: MPI_Issend 同步模式非阻塞消息发送函数,提交一个同步模式的非阻塞式消息发送操作。 MPI_Issend (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 发送缓存中的数据单元个数 IN datatype 数据类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 通讯请求

MPI点对点通讯函数

MPI点对点通讯函数 就绪模式: MPI_Rsend 就绪模式消息发送函数,执行一个就绪模式的阻塞式消息发送操作。 MPI_Rsend (buf, count, datatype, dest, tag, comm) IN buf 发送缓存的初始地址 IN count 发送缓存中数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器

MPI点对点通讯函数

MPI点对点通讯函数

MPI点对点通讯函数 就绪模式: MPI_Irsend 就绪模式非阻塞消息发送函数,提交一个就绪模式的非阻塞式消息发送操作。 MPI_Irsend (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 发送缓存中数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 通讯请求

MPI点对点通讯函数

MPI点对点通讯函数 持久通讯模式: MPI_Send_init 消息发送持久通讯请求创建函数,创建一个消息发送持久通讯请求。 MPI_Send_init (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 持久通讯请求 重复执行具有相同参数的消息发送和消息接收通讯操作。 创建非阻塞消息发送和消息接收持久通讯请求,并将消息捆绑到该请求中。 只是空间绑定,里面内容任意修改。

MPI点对点通讯函数

MPI点对点通讯函数 持久通讯模式: MPI_Recv_init 消息接收持久通讯请求创建函数,创建一个消息接收持久通讯请求。 MPI_Recv_init (buf, count, datatype, source, tag, comm, request) IN buf 消息接收缓存的初始地址 IN count 数据单元个数 IN datatype 数据单元类型 IN source 发送进程号 IN tag 消息标记 IN comm 通讯器 OUT request 持久通讯请求

MPI点对点通讯函数

MPI点对点通讯函数 持久通讯模式: MPI_Start 持久通讯请求提交函数,创建一个持久通讯请求。 MPI_Start (request) INOUT request 持久通讯请求

MPI点对点通讯函数 持久通讯模式: MPI_Startall 持久通讯请求提交函数,创建一个给定序列包含的所有持久通讯请求 MPI_Startall (count, array_of_requests) IN count 持久通讯序列包含的通讯请求个数。 INOUT array_of_requests 持久通讯请求序列

MPI点对点通讯函数 持久通讯模式: MPI_Bsend_init 缓存模式持久通讯函数,创建一个缓存模式消息发送持久通讯请求。 MPI_Bsend_init (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 持久通讯请求

MPI点对点通讯函数

MPI点对点通讯函数 持久通讯模式: MPI_Ssend_init 同步模式持久通讯函数,创建一个同步模式消息发送持久通讯请求。 MPI_Ssend_init (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 持久通讯请求

MPI点对点通讯函数

MPI点对点通讯函数 持久通讯模式: MPI_Rsend_init 就绪模式持久通讯函数,创建一个就绪模式消息发送持久通讯请求。 MPI_Rsend_init (buf, count, datatype, dest, tag, comm, request) IN buf 发送缓存的初始地址 IN count 数据单元个数 IN datatype 数据单元类型 IN dest 接收进程号 IN tag 消息标记 IN comm 通讯器 OUT request 持久通讯请求

MPI点对点通讯函数

MPI点对点通讯函数 MPI_Request_free 通讯请求取消函数,在通讯请求相关联的非阻塞通讯操作完成后,释放该请求。 MPI_Request_free (request) INOUT request 通讯请求 非阻塞通讯请求和持久通讯请求。

MPI点对点通讯函数 MPI_Cancel MPI_Cancel (request) IN request 通讯请求 与MPI_Request_free不同,强行取消通讯请求。

MPI点对点通讯函数 MPI_Test_cancelled 通讯请求查询函数,查询一个通讯请求是否已被取消。 MPI_Test_cancelled (status, flag) IN status 接收返回状态信息 OUT flag true表示该请求已被取消

MPI集合通讯函数 通信器的所有进程参与,所有进程都调用聚合通信函数 聚合通信不需要消息标号 聚合通信函数都为阻塞式函数 聚合通信的功能:通信、同步、计算等 1 2 3 4 5 communicator

MPI集合通讯函数 集合通讯函数必须包含通讯器对应的组中所有进程。 默认情况下,所有进程都是通讯器MPI_COMM_WORLD中成员。 用户可以自定义通讯器。 如果组内进程并未全部参与到集合通讯函数中,会导致程序出现不和预知的行为。 用户负责保证组内所有进程参与到集合通讯函数中,MPI并不进行相关检查。

MPI集合通讯函数 集合通讯的类型: 进程同步。进程到达同步点后进行等待,直到所有进程都到达同步点。 数据移动。 集合计算。一个进程收集来自组内其他进程的数据,并对这些数据进行计算操作。

MPI集合通讯函数 MPI_Barrier 同步操作。在组中设置一个障碍同步。当到达MPI_Barrier语句时,每个进程都要等到组中所有进程都到达MPI_Barrier语句时才能进入到下一条语句。 MPI_Barrier (comm) IN comm 通讯器

MPI集合通讯函数 MPI_Bcast 消息广播函数,在进程组各成员中执行一个消息广播操作。 MPI_Bcast (buffer, count, datatype, root, comm) INOUT buffer 待广播的消息缓存起始地址 IN count 待广播的消息缓存内数据单元个数 IN datatype 待广播的消息缓存内数据单元类型 IN root 根进程的进程号 IN comm 通讯器

MPI集合通讯函数

MPI集合通讯函数 根进程中该消息缓存为消息发送缓存 其他进程该消息缓存为消息接收缓存 每个进程提供的root和comm必须完全一致,否则程序死锁。

MPI集合通讯函数 MPI_Scatter 分发聚合通讯函数,在进程组各成员中执行一个消息分发操作。

MPI集合通讯函数 MPI_Scatter (sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) IN sendbuf 根进程消息发送缓存起始地址 IN sendcount 根进程向各进程发送的数据单元个数 IN sendtype 根进程消息发送缓存内数据单元类型 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcount 各进程从根进程接收的数据单元个数 IN recvtype 各进程从根进程接收的数据单元类型 IN root 根进程的进程号 IN comm 通讯器

MPI集合通讯函数

MPI集合通讯函数

MPI集合通讯函数 MPI_Scatterv 向量分发聚合通讯函数,在进程组各成员中执行一个基于向量的消息分发操作。

MPI集合通讯函数 MPI_Scatterv (sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm) IN sendbuf 根进程消息发送缓存起始地址 IN sendcounts 数组,包含发送给各个进程的消息包含 的数据单元个数 IN displs 数组,包含发送给各个进程的消息起始 地址(数据单元为单位) IN sendtype 发送给各进程的消息包含数据单元类型 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcount 各进程从根进程接收的数据单元个数 IN recvtype 各进程从根进程接收的数据单元类型 IN root 根进程的进程号 IN comm 通讯器

MPI集合通讯函数

MPI集合通讯函数 MPI_Gather 收集聚合通讯函数,在进程组各成员中执行一个消息收集操作。

MPI集合通讯函数 MPI_Gather (sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm) IN sendbuf 各进程消息发送缓存起始地址 IN sendcount 各进程消息发送缓存中数据单元个数 IN sendtype 各进程消息发送缓存中数据单元类型 OUT recvbuf 根进程提供的消息接收缓存起始地址 IN recvcount 根进程从各进程接收的数据单元个数 IN recvtype 根进程从各进程接收的数据单元类型 IN root 根进程的进程号 IN comm 通讯器

MPI集合通讯函数

MPI集合通讯函数

MPI集合通讯函数 MPI_Gatherv 向量收集聚合通讯函数,在进程组各成员中执行一个基于向量的消息收集操作。

MPI集合通讯函数 MPI_Gatherv (sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, root, comm) IN sendbuf 各进程消息发送缓存起始地址 IN sendcount 各进程消息发送缓存中数据单元个数 IN sendtype 各进程消息发送缓存中数据单元类型 OUT recvbuf 根进程提供的消息接收缓存起始地址 IN recvcounts 数组,含从各进程接收的数据单元个数 IN displs 数组,含存储各进程数据单元起始地址 (以数据单元为单位) IN recvtype 消息接收缓存中数据单元类型 IN root 根进程的进程号 IN comm 通讯器

MPI集合通讯函数

MPI集合通讯函数 MPI_Allgather 全收集聚合通讯函数,进程组各成员执行一个全收集聚合通讯操作。 MPI_Allgather (sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) IN sendbuf 各进进程消息发送缓存起始地址 IN sendcount 各进程消息发送缓存中数据单元个数 IN sendtype 各进程消息发送缓存中数据单元类型 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcount 各进程从其他进程接收的数据单元个数 IN recvtype 各进程从其他进程接收的数据单元类型 IN comm 通讯器

MPI集合通讯函数

MPI集合通讯函数

MPI集合通讯函数 MPI_Allgatherv 向量全收集聚合通讯函数,进程组各成员中执行一个基于向量的全收集聚合通讯操作。 MPI_Allgatherv (sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm) IN sendbuf 各进程消息发送缓存起始地址 IN sendcount 各进程消息发送缓存中数据单元个数 IN sendtype 各进程消息发送缓存中数据单元类型 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcounts 数组,包含从各进程接收数据单元个数 IN displs 数组,包含接收数据单元的起始地址( 数据单元为单位) IN recvtype 各进程从其他进程接收的数据单元类型 IN comm 通讯器

MPI集合通讯函数

MPI集合通讯函数 MPI_Alltoall 全交换聚合通讯函数,在进程组各成员中执行一个全交换聚合通讯操作。 MPI_Alltoall (sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, comm) IN sendbuf 各进程提供的消息发送缓存起始地址 IN sendcount 各进程向其他进程发送的数据单元个数 IN sendtype 各进程向其他进程发送的数据单元类型 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcount 各进程从其他进程接收的数据单元个数 IN recvtype 各进程从其他进程接收的数据单元类型 IN comm 通讯器

MPI集合通讯函数

MPI集合通讯函数 首先,每个进程均执行一个分发聚合通讯操作MPI_Scatther(sendbuf, sendcount, sendtype,…),即将消息发送缓存内所有数据按进程个数等分,按由小到大的进程序号,依次分发给各个进程。 然后,每个进程均执行一个收集聚合通讯操作MPI_Gather(…, recvbuf, recvcount, recvtype,…),即从各个进程收集被分发给自身的数据,也同样按按由小到大的进程序号,依次存储在消息接收缓存中。

MPI集合通讯函数 MPI_Alltoallv 向量全交换聚合通讯函数,在进程组各成员中执行一个基于向量的全交换聚合通讯操作。 MPI_Alltoallv (sendbuf, sendcounts, sdispls, sendtype, recvbuf, recvcounts, rdispls, recvtype, comm) IN sendbuf 各进程提供的消息发送缓存起始地址 IN sendcounts 数组,包含个进程发送的数据单元个数 IN sdispls 数组,包含各进程发送的数据起始存储 地址(单元为单位) IN sendtype 各进程向其他进程发送的数据单元类型 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcounts 数组,含从各进程接收的数据单元个数 IN rdispls 数组,包含从各进程接收的数据起始存 储地址(单元为单位) IN recvtype 各进程从其他进程接收的数据单元类型 IN comm 通讯器 每个进程首先执行一个基于变量的分发聚合通讯操作MPI_SCATTERV,然后执行一个基于向量的收集聚合通讯操作MPI_GATHERV。 元素sendcounts(i)表示分发给第i个进程的消息包含的数据单元个数,sdispls(i)表示这些数据在消息发送缓存的首地址,元素recvcounts(i)表示从第j个进程接收的消息包含的数据单元个数,rdispls(j)表示这些数据在消息接收缓存中的首地址。

MPI集合通讯函数

MPI集合通讯函数 MPI_Reduce 归约聚合通讯函数,对各进程提供的局部变量执行一个全局归约操作,并将结果存储在根进程的消息接收缓存中。 MPI_Reduce (sendbuf, recvbuf, count, datatype, op, root, comm) IN sendbuf 各进程提供的消息发送缓存起始地址 OUT recvbuf 根进程提供的消息接收缓存起始地址 IN count 各进程提供的待归约的数据单元个数 IN datatype 各进程提供的待归约的数据单元类型 IN op 归约操作 IN root 根进程的进程号 IN comm 通讯器

MPI集合通讯函数

MPI集合通讯函数 消息发送缓存和消息接收缓存必须互不重叠,并且提供的数据类型与提供的规约操作相匹配。

MPI Reduction Operation C Data Types Fortran Data Type MPI_MAX maximum integer, float integer, real, complex MPI_MIN minimum MPI_SUM sum MPI_PROD product MPI_LAND logical AND integer logical MPI_BAND bit-wise AND integer, MPI_BYTE MPI_LOR logical OR MPI_BOR bit-wise OR MPI_LXOR logical XOR MPI_BXOR bit-wise XOR MPI_MAXLOC max value and location float, double and long double real, complex,double precision MPI_MINLOC min value and location real, complex, double precision

MPI集合通讯函数 MPI_MAXLOC, MPI_MINLOC 对各进程提供的局部变量求全局最大值(最小值),并返回属于该值的某个信息,例如拥有该值的进程号。

MPI集合通讯函数 C Fortran 数据类型 描述 MPI_FLOAT_INT float与int MPI_2REAL REAL与REAL MPI_LONG_DOUBLE_INT long double与int MPI_2DOUBLE_PRECISION DOUBLE PRECISION与 DOUBLE PRECISION MPI_LONG_INT long与int MPI_2INTEGER INTEGER与INTEGER MPI_2INT int与int MPI_SHORT_INT short与int MPI_DOUBLE_INT double与int

MPI集合通讯函数 MPI_Allreduce 全归约聚合通讯函数,对各进程提供的局部变量执行一个全局归约操作,并将结果存储在各进程的消息接收缓存中。 MPI_Allreduce (sendbuf, recvbuf, count, datatype, op, comm) IN sendbuf 各进程提供的消息发送缓存起始地址 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN count 各进程提供的待归约的数据单元个数 IN datatype 各进程提供的待归约的数据单元类型 IN op 归约操作 IN comm 通讯器

MPI集合通讯函数

MPI集合通讯函数

MPI集合通讯函数 MPI_Reduce_scatter 归约分发聚合通讯函数,对各进程提供的局部变量执行一个全局归约操作,并将结果分发到各进程提供的消息接收缓存中。 MPI_Reduce_scatter (sendbuf, recvbuf, recvcounts, datatype, op, comm) IN sendbuf 各进程提供的消息发送缓存起始地址 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN recvcounts 数组,各进程待接收的数据单元个数 IN datatype 各进程提供的待归约的数据单元类型 IN op 归约操作 IN comm 通讯器

MPI集合通讯函数

MPI集合通讯函数 首先,在个进程提供的消息发送缓存 (sendbuf, count, datatype) 包含的数据单元中执行规约操作,其中count为recvcounts数组中元素之和。 然后,将规约结果分成n个连续的端,其中第i段包含recvcounts(i)个数据单元,并存储在第i个进程的接收缓存中。

MPI集合通讯函数 MPI_Scan 并行前缀归约聚合通讯函数,对各个进程提供的局部变量执行一个并行前缀归约,并将结果分别存储在各进程提供的消息接收缓存中。 MPI_Scan (sendbuf, recvbuf, count, datatype, op, comm) IN sendbuf 各进程提供的消息发送缓存起始地址 OUT recvbuf 各进程提供的消息接收缓存起始地址 IN count 各进程提供的数据单元个数 IN datatype 各进程提供的数据单元类型 IN op 归约操作 IN comm 通讯器

MPI集合通讯函数

MPI集合通讯函数 按由小到大的进程序号与操作op,执行并行前缀计算,其中第i个进程获得进程0到进程i的规约结果。

MPI集合通讯函数 MPI_Op_create 归约操作创建函数,创建一个归约操作。 MPI_Op_create (function, commute, op) IN function 外部函数,用于定义特殊的归约操作 IN commute 若true,则归约操作可交换 OUT op 归约操作

MPI集合通讯函数

MPI集合通讯函数 外部函数:

MPI集合通讯函数 MPI_Op_free 归约操作释放函数,释放一个归约操作。 MPI_Op_free (op) IN op 归约操作

MPI自定义数据类型与数据封装 MPI_Type_contiguous 自定义数据类型创建函数,在连续的内存空间上创建一个新的数据类型。 MPI_Type_contiguous (count, oldtype, newtype) IN count oldtrype数据单元个数 IN oldtype 旧的数据类型 OUT newtype 新的数据类型

MPI自定义数据类型与数据封装

MPI自定义数据类型与数据封装

MPI自定义数据类型与数据封装 MPI_Type_vector 自定义数据类型创建函数,创建一个新的数据类型,由间隔的多个数据块组成。 MPI_Type_vector (count, blocklength, stride, oldtype, newtype) IN count 数据块个数 IN blocklength 每个数据块包含的oldtype数据单元个数 IN stride 以数据单元为单位,连续两个数据块起 始地址之间的间距 IN oldtype 旧的数据类型 OUT newtype 新的数据类型

MPI自定义数据类型与数据封装

MPI自定义数据类型与数据封装

MPI自定义数据类型与数据封装 MPI_Type_hvector 自定义数据类型创建函数,创建一个新的数据类型,由间隔的多个数据块组成。 MPI_Type_hvector (count, blocklength, stride, oldtype, newtype) IN count 数据块个数 IN blocklength 每个数据块包含的oldtype数据单元个数 IN stride 以字节为单位,连续两个数据块起 始地址之间的间距 IN oldtype 旧的数据类型 OUT newtype 新的数据类型

MPI自定义数据类型与数据封装

MPI自定义数据类型与数据封装 MPI_Type_indexed 自定义数据类型创建函数,创建一个新的数据类型,由任意间隔(以原始数据类型为单位)的多个数据块组成。 MPI_Type_indexed (count, array_of_blocklengths, array_of_displacements, oldtype, newtype) IN count 数据块个数 IN array_of_blocklengths 数组,包含每个数据块拥有的 数据单元个数 IN array_of_displacements 数组,包含每个数据块的初始 位置(oldtype为单位) IN oldtype 旧的数据类型 OUT newtype 新的数据类型

MPI自定义数据类型与数据封装

MPI自定义数据类型

MPI自定义数据类型与数据封装 MPI_Type_hindexed 自定义数据类型创建函数,创建一个新的数据类型,由任意间隔(以字节为单位)的多个数据块组成。 MPI_Type_hindexed (count, array_of_blocklengths, array_of_displacements, oldtype, newtype) IN count 数据块个数 IN array_of_blocklengths 数组,包含每个数据块拥有的 数据单元个数 IN array_of_displacements 数组,包含每个数据块的初始 位置(字节为单位) IN oldtype 旧的数据类型 OUT newtype 新的数据类型

MPI自定义数据类型与数据封装

MPI自定义数据类型与数据封装 MPI_Type_struct 自定义数据类型创建函数,创建一个新的数据类型,由多种不同数据类型组成。 MPI_Type_struct (count, array_of_blocklengths, array_of_displacements, array_of_types, newtype) IN count 数据块个数 IN array_of_blocklengths 数组,包含每个数据块拥有的 数据单元个数 IN array_of_displacements 数组,包含每个数据块的初始 位置(字节为单位) IN array_of_types 数组,包含每个数据块拥有的数据 单元类型 OUT newtype 新的数据类型

MPI自定义数据类型与数据封装

MPI自定义数据类型与数据封装

MPI自定义数据类型与数据封装 MPI_Address 内存地址查询函数,获取给定变量在内存空间的绝对地址。 MPI_Address (location, address) IN location 变量 OUT address 内存地址

MPI自定义数据类型与数据封装 MPI_Type_commit 自定义数据类型提交函数,提交一个已定义的自定义数据类型给MPI环境。 MPI_Type_commit (datatype) INOUT datatype 被提交的自定义数据类型

MPI自定义数据类型与数据封装 MPI_Type_free 自定义数据类型释放函数,MPI环境释放一个已定义的自定义数据类型。 MPI_Type_free (datatype) INOUT datatype 被释放的自定义数据类型

MPI自定义数据类型与数据封装 MPI_Pack 数据封装函数,封装应用程序数据单元到应用程序提供的缓存中。 MPI_Pack (inbuf, incount, dataytpe, outbuf, outsize, position, comm) IN inbuf 包含数据单元的输入缓存起始地址 IN incount 输入数据单元个数 IN datatype 输入数据单元类型 OUT outbuf 输出缓存起始地址 IN outsize 输出缓存大小(字节为单位) INOUT position 输出缓存当前位置(字节为单位) IN comm 通讯器

MPI自定义数据类型与数据封装

MPI自定义数据类型与数据封装 MPI_Unpack 数据拆卸函数,从应用程序显示提供的输入缓存中拆卸数据单元到个输出缓存。 MPI_Unpack (inbuf, insize, position, outbuf, outcount, dataytpe, comm) IN inbuf 包含数据单元的输入缓存起始地址 IN insize 输入缓存大小(字节为单位) INOUT position 被拆卸的数据单元在输入缓存的起始 位置(字节为单位) OUT outbuf 输出缓存起始地址 IN outcount 被拆卸的数据单元个数 IN datatype 数据单元类型 IN comm 通讯器

MPI自定义数据类型与数据封装

MPI自定义数据类型与数据封装 MPI_Pack_size 消息大小查询函数,获取某个消息包含的所有数据单元的大小。 MPI_Pack_size (incount, datatype, comm, size) IN incount 消息包含的数据单元个数 IN datatype 消息包含的数据单元类型 IN comm 通讯器 OUT size 消息大小(字节为单位)

MPI自定义数据类型与数据封装

MPI进程组与通讯器 进程组(process group): MPI中一类有序进程的集合,并且每个进程都具有唯一的序号。 通讯器: 域内通讯器:如果某个通讯域只涉及同一个进程组内部成员之间的通讯,则称该通讯域内发生的通讯为域内通讯,且称相应通讯器为域内通讯器。 域间通讯器:如果某个通讯域涉及两个不同进程组成员之间的通讯,则称该类通讯为域间通讯,且称相应通讯器为域间通讯器。

MPI进程组与通讯器 域内通讯器属性: 1. 所包含的进程组 2. 描述该进程组内成员联接状态的拓扑结构 域间通讯器属性: MPI_GROUP_EMPTY 空进程组 MPI_GROUP_NULL 无效进程组 MPI_COMM_WORLD 全局通讯器 MPI_COMM_SELF 局部通讯器

MPI进程组与通讯器

MPI进程组与通讯器 MPI_Comm_group 初始进程组获取函数,获取某个通讯器包含的进程组。 MPI_Comm_group (comm, group) IN comm 通讯器 OUT group 通讯器包含的进程组

MPI进程组与通讯器 MPI_Group_union 进程组并集创建函数,基于两个进程组成员的并集,创建一个新的进程组。 MPI_Group_union (group1, gourp2, newgroup) IN group1 进程组1 IN group2 进程组2 OUT newgroup 新进程组

MPI进程组与通讯器

MPI进程组与通讯器 MPI_Group_intersection 进程组交集创建函数,基于两个进程组成员的交集,创建一个新的进程组。 MPI_Group_intersection (group1, gourp2, newgroup) IN group1 进程组1 IN group2 进程组2 OUT newgroup 新进程组

MPI进程组与通讯器

MPI进程组与通讯器 MPI_Group_difference 进程组差集创建函数,基于两个进程组成员的差集,创建一个新的进程组。 MPI_Group_difference (group1, gourp2, newgroup) IN group1 进程组1 IN group2 进程组2 OUT newgroup 新进程组

MPI进程组与通讯器

MPI进程组与通讯器 MPI_Group_union 进程组group1的所有进程,加上进程组group2中不属于进程组group1的所有进程,组成新的进程组。新进程组中的进程重新排序,先把group1中进程由小到大,然后不属于group1中的group2中进程由小到大排序。 MPI_Group_intersection 进程组group1中属于进程组group2的所有进程,组成新的进程组。并以它们在进程组group1中的序号,由小到大重新排序。 MPI_Group_difference 进程组group1中不属于进程组group2的所有进程,组成新的进程组。并以它们在进程组group1中的序号,由小到大重新排序。

MPI进程组与通讯器 MPI_Group_incl 进程组子集创建函数,基于两个进程组成员的子集,创建一个新的进程组。 MPI_Group_incl (group, n, ranks, newgroup) IN group 进程组 IN n 新进程组包含的进程个数 IN ranks 新进程组包含的进程在group中的序号组成 的数组 OUT newgroup 新进程组 保持在原进程组中的次序。 如果n=0,返回空进程组newgroup=MPI_GROUP_NULL。

MPI进程组与通讯器

MPI进程组与通讯器 MPI_Group_excl 进程组补集创建函数,基于两个进程组成员的补集,创建一个新的进程组。 MPI_Group_excl (group, n, ranks, newgroup) IN group 进程组 IN n 进程组group中不属于新进程组的进程个数IN ranks 进程组group中不属于新进程组的进程序号 组成的数组 OUT newgroup 新进程组 保持在原进程组中的次序。

MPI进程组与通讯器

MPI进程组与通讯器 MPI_Group_size 进程组大小查询函数,查询进程组成员的个数。 MPI_Group_size (group, size) IN group 进程组 OUT size 进程组成员个数 group=MPI_GROUP_EMPTY,size=0 group=MPI_GROUP_NULL,程序出错。

MPI进程组与通讯器 MPI_Group_rank 进程序号查询函数,查询进程组某个成员的序号。 MPI_Group_rank (group, rank) IN group 进程组 OUT rank 进程组成员的序号 如果不在group中,则rank=MPI_UNDEFINED。

MPI进程组与通讯器 MPI_Group_translate_ranks 进程序号对应关系查询函数,查询一个进程组内某个进程在另一个进程组内的相应序号。 MPI_Group_translate_ranks (group1, n, ranks1, group2, ranks2) IN group1 进程组1 IN n 数组ranks1和ranks2的长度 IN ranks1 数组,包含进程组group1内待查询的进程 序号 IN group2 进程组2 OUT ranks2 数组,包含进程组group1内待查询的进程 在进程组group2中的序号 如果不在group2中,则返回MPI_UNDEFINED。

MPI进程组与通讯器

MPI进程组与通讯器 MPI_Group_compare 进程组比较函数,返回两个进程组的比较结果。 MPI_Group_compare (group1, group2, result) IN group1 进程组1 IN group2 进程组2 OUT result 比较结果

MPI进程组与通讯器 result = MPI_IDENT 两个进程组包含的进程相同,它们的序 号相同 result = MPI_SIMILAR 两个进程组包含的进程相同,但是进程 的序号不同 result = MPI_UNEQUAL 两个进程组分别包含不同的进程

MPI进程组与通讯器 MPI_Group_free 进程组释放函数,释放一个已创建的进程组。 MPI_Group_free (group) INOUT group 进程组 MPI_GROUP_NULL MPI_GROUP_EMPTY MPI_COMM_WORLD MPI_COMM_SELF

MPI进程组与通讯器 MPI_Comm_dup 通讯器复制函数,复制一个进程通讯器。 MPI_Comm_dup (comm, newcomm) IN comm 原通讯器 OUT newcomm 复制的新通讯器

MPI进程组与通讯器 需要通讯器中所有进程共同参与。 虽然生成的新通讯器与原通讯器具有相同的进程组,但是仍然是两个不同的通讯器。

MPI进程组与通讯器 MPI_Comm_create 通讯器创建函数,基于某个通讯器包含的进程组子集,创建一个新通讯器。 MPI_Comm_create (comm, group, newcomm) IN comm 原通讯器 IN group 组成新通讯器的进程组子集 OUT newcomm 新通讯器 需要通讯器中所有进程共同参与。 新通讯器不继承原通讯器的属性(例如拓扑结构)。 不属于新通讯器的进程,newcomm=MPI_COMM_NULL。每个进程提供的group是相同的,否则函数出错。

MPI进程组与通讯器

MPI进程组与通讯器 MPI_Comm_split 通讯器创建函数,分裂某个通讯器成多个进程组,并同时为每个进程组创建一个新通讯器。 MPI_Comm_split (comm, color, key, newcomm) IN comm 原通讯器 IN color 各个进程提供的用于分组的整形参数 IN key 各个进程提供的用于同组内进程排序的整 形参数 OUT newcomm 新通讯器

MPI进程组与通讯器

newcomm=MPI_COMM_NULL 序号 1 2 3 4 5 6 7 8 9 进程 a b c d e f g h i j color * key comm1 comm2 comm3 comm4 a c h j g i d e f color区分通讯器,key给进程新的序号,如果相等则按照原通讯器中的序号,由小到大的顺序。 a=2 d=3 f=0 g=1 c=2 e=0 i=1 h=0 j=0 color=MPI_UNDEFINED newcomm=MPI_COMM_NULL

MPI进程组与通讯器 MPI_Comm_size 通讯器大小查询函数,获取某个通讯器包含的进程个数。 MPI_Comm_size (comm, size) IN comm 通讯器 OUT size 通讯器包含的进程个数

MPI进程组与通讯器 MPI_Comm_rank 进程序号查询函数,获取某个进程在通讯器中的序号。 MPI_Comm_rank (comm, rank) IN comm 通讯器 OUT rank 进程序号

MPI进程组与通讯器 MPI_Comm_compare 通讯器比较函数,比较两个通讯器的异同。 MPI_Comm_compare (comm1, comm2, result) IN comm1 通讯器1 IN comm2 通讯器2 OUT result 比较结果

MPI进程组与通讯器 result = MPI_IDENT comm1与comm2代表同一个通讯域 result = MPI_CONGRUENT comm1与comm2拥有相同的进程组 result = MPI_SIMILAR comm1与comm2拥有的进程组成员相同 ,但是进程序号不同 result = MPI_UNEQUAL comm1与comm2拥有的进程组成员不同

MPI进程组与通讯器 MPI_Comm_free 通讯器释放函数,释放一个已创建的进程通讯器。 MPI_Comm_free (comm) INOUT comm 通讯器 需要通讯器中所有进程共同参与。 释放已创建的通讯器comm,并将comm=MPI_COMM_NULL。 如果存在尚未完成的通讯操作,则阻塞等待这些通讯操作完成后才释放该通讯器。 MPI_COMM_WORLD,MPI_COMM_NULL,MPI_COMM_SELF则函数调用出错。

MPI进程组与通讯器 将两个进程组合为一个进程组,并建立通讯器,也就是转化为域内通讯。 直接组织属于不同通讯域的两个进程之间的通讯,也就是域间通讯。

MPI进程组与通讯器 MPI_Intercomm_create 域间通讯器创建函数,创建一个联接两个不同域内通讯器的域间通讯器 MPI_Intercomm_create (local_comm, local_leader, bridge_comm, remote_leader, tag, newintercomm) IN local_comm 本地域内通讯器 IN local_leader 本地桥进程在本地域内通讯器 local_comm中的序号 IN bridge_comm 包含本地桥进程和远程桥进程的 域内通讯器 IN remote_leader 远程桥进程在通讯器bridge_comm 中的序号 IN tag 安全标号 OUT newintercomm 域间通讯器 需要两个域内通讯器中所有进程共同参与,且属于同一域内通讯器的进程必须提供相同的域内通讯器local_comm。

MPI进程组与通讯器

MPI进程组与通讯器 comm1 MPI_Intercomm_create (comm1, 1, MPI_COMM_WORLD, 3, 111, intercomm) comm2 MPI_Intercomm_create (comm2, 0, MPI_COMM_WORLD, 1, 111, intercomm) comm1 comm2 1 3 6 4 2 5

MPI进程组与通讯器 MPI_Intercomm_merge 域间通讯器合并函数,通过合并两个域间通讯器,创建一个域内通讯器。 MPI_Intercomm_merge (intercomm, high, newintracomm) IN intercomm 域间通讯器 IN high 进程序号排序优先级 OUT newintracomm 域内通讯器

MPI进程组与通讯器

MPI进程组与通讯器 MPI_Comm_test_inter 域间通讯器查询函数,返回一个通讯器是否为域间通讯器的信息。 MPI_Comm_test_inter (comm, flag) IN comm 通讯器 OUT flag 若comm为域间通讯器,则返回true

MPI进程组与通讯器 MPI_Comm_remote_size 域间通讯器查询函数,返回域间通讯器联接的远程进程组大小。 MPI_Comm_remote_size (comm, size) IN comm 通讯器 OUT size 域间通讯器联接的远程进程组大小

MPI进程组与通讯器 MPI_Comm_remote_group 域间通讯器查询函数,返回域间通讯器联接的远程进程组。 MPI_Comm_remote_group (comm, group) IN comm 通讯器 OUT group 域间通讯器联接的远程进程组

MPI进程拓扑结构 MPI_Cart_create Cartesian拓扑结构创建函数,创建一个包含Cartesian拓扑结构的新通讯器。 MPI_Cart_create (comm_old, ndim, dims, periods, reorder, comm_cart) IN comm_old 原通讯器 IN ndim 待创建的Cartesian拓扑结构的维数 IN dims 数组,含拓扑结构各维包含的进程个数 IN periods 数组,含各维的进程是否周期联接标志 IN reorder true表示重新排列进程的序号 OUT comm_cart 含Cartesian拓扑结构的新通讯器 只存在于域内通讯器。 需要通讯器comm_old中所有进程共同参与,且每个进程提供完全一致的参数(ndim, dims, periods, reorder)

MPI进程拓扑结构

MPI进程拓扑结构 ndim 待创建的拓扑结构维数 dims 长度为ndim的数组,元素分别表示拓扑结构各维度包含 的进程数量 periods 长度为ndim的数组,元素若为真表示拓扑结构沿着该维 度的所有结点首尾相连 reorder true表示进程在新通讯器中重新排序 ndim = 2 dims(0) = 3 dims(1) = 4 periods(0) = 0 periods(0) = 0 reorder = true 0/(0,0) 1/(0,1) 2/(0,2) 3/(0,3) 4/(1,0) 5/(1,1) 6/(1,2) 7/(1,3) 8/(2,0) 9/(2,1) 10/(2,2) 11/(2,3) 如果comm_cart包含的进程数量小于comm_old,则存在一些进程返回comm_cart=MPI_COMM_NULL。 反之,各进程函数调用出错。 无论对于C还是Fortran, Cartesian拓扑结构以行来排列进程,其坐标序号从0开始。

MPI进程拓扑结构 MPI_Dims_create Cartesian拓扑结构辅助函数,给定结点总数和维数,该函数返回Cartesian拓扑结构各维包含的最优结点个数。 MPI_Dims_create (nnode, ndim, dims) IN nnode 结点总数 IN ndim Cartesian拓扑结构的维数 INOUT dims 长度为ndim的数组,其元素代表各维包 含的结点个数

MPI进程拓扑结构 输入dims 函数调用 返回dims (0,0) (6,2,dims) (3,2) (7,2,dims) (7,1) (0,3,0) (6,3,dims) (2,3,1) (7,3,dims) 出错

MPI进程拓扑结构 MPI_Cartdim_get Cartesian拓扑结构查询函数,返回Cartesian拓扑结构的维数。 MPI_Cartdim_get (comm, ndim) IN comm 含Cartesian拓扑结构的通讯器 OUT ndim Cartesian拓扑结构的维数

MPI进程拓扑结构 MPI_Cart_get Cartesian拓扑结构查询函数,返回Cartesian拓扑结构的基本信息。 MPI_Cart_get (comm, maxdim, dims, periods, coords) IN comm 含Cartesian拓扑结构的通讯器 IN maxdim Cartesian拓扑结构的维数 OUT dims 数组,包含各维度结点个数 OUT periods 数组,包含各维度是否周期联接信息 OUT coords 数组,包含调用该函数进程的坐标

MPI进程组与通讯器

MPI进程拓扑结构 MPI_Cart_rank Cartesian拓扑结构查询函数,返回某个坐标对应的进程序号。 MPI_Cart_rank (comm, coords, rank) IN comm 含Cartesian拓扑结构的通讯器 IN coords 数组,待查询进程的Cartesian坐标 OUT rank 待查询进程的序号

MPI进程拓扑结构 MPI_Cart_coords Cartesian拓扑结构相邻进程查询函数,返回某个进程的坐标。 MPI_Cart_coords (comm, rank, maxdim, coords) IN comm 含Cartesian拓扑结构的通讯器 IN rank 待查询进程号 IN maxdim Cartesian拓扑结构维数 OUT coords 数组,包含待查询进程的Cartesian坐标

MPI进程拓扑结构 MPI_Cart_shift Cartesian拓扑结构相邻进程查询函数,查询某个进程沿某个方向的相邻进程。 MPI_Cart_shift (comm, disp, direction, rank_source, rank_dest) IN comm 含Cartesian拓扑结构的通讯器 IN disp 待查询的坐标维 IN direction 待查询的坐标方向 OUT rank_source 源进程的序号 OUT rank_dest 目的进程的序号

MPI进程组与通讯器

MPI进程拓扑结构 direction>0 沿坐标值大的方向 direction<0 沿坐标值小的方向 rank_source 源进程,沿移位逆方向,函数调用进程的相邻进程 rank_dest 目的进程,沿移位方向,函数调用进程的相邻进程

MPI进程拓扑结构 MPI_Cart_sub Cartesian拓扑结构分解函数,按坐标的不同维,将某个通讯器分解为多个独立的新通讯器,且每个新通讯器集成它包含的所有进程在原通讯器中的拓扑结构。 MPI_Cart_sub (comm, remain_dims, newcomm) IN comm 含Cartesian拓扑结构的通讯器 IN remain_dims 数组,是否包含在新通讯器中 OUT newcomm 新通讯器 需要通讯器中所有进程共同参与,根据各进程提供的参数remain_dims来确定如何分解通讯器,并形成多个独立的新通讯器。

MPI进程拓扑结构 remian_dims(i) = true 第i-1维的所有进程将被保留在新通讯器中 remian_dims(i) = false 第i-1维的所有进程将被排除在新通讯器之外 Cartesian拓扑结构为2×3×4 reamian_dims = (true, false, true) 产生3个独立的通讯器,每个包含8个进程,具有2×4 Cartesian拓扑结构。 reamian_dims = (false, false, true) 产生6个独立的通讯器,每个包含4个进程,具有 一维Cartesian拓扑结构。

MPI进程组与通讯器

MPI进程拓扑结构 MPI_Cart_map Cartesian拓扑结构映射函数,为每个进程映射一个新的序号。 MPI_Cart_map (comm, ndim, dims, periods, newrank) IN comm 通讯器 IN ndim 拓扑结构的维数 IN dims 数组,拓扑结构各维度的进程数量 IN periods 数组,各维度进程是否周期联接信息 OUT newrank 新的进程序号

MPI进程组与通讯器

MPI进程拓扑结构 MPI_Graph_create 图拓扑结构创建函数,给定一个图,在原通讯器上创建一个以图为拓扑结构的新通讯器。 MPI_Graph_create (comm_old, nnode, indexs, edges, reorder, comm_graph) IN comm_old 原通讯器 IN nnode 图拓扑结构包含的结点总数 IN indexs 图拓扑结构的邻居结点数组 IN edges 图拓扑结构的边数组 IN reorder true表示进程将在新通讯器中重新排序 OUT comm_graph 含图拓扑结构的新通讯器 需要所有进程共同参与,且要求所有进程提供一直的参数(nnode, indexs, edges)。

MPI进程组与通讯器

MPI进程拓扑结构 nnode 图中结点个数 index(i) 前i个结点邻居结点数之和 edges 结点0,…,nnode-1的邻居结点的序号 nnode = 4 index = (2, 3, 4, 6) edges = (1, 3, 0, 3, 0, 2)

MPI进程拓扑结构 MPI_Graphdims_get 图拓扑结构查询函数,查询图拓扑结构包含的结点数和边数。 MPI_Graphdims_get (comm, nnode, nedge) IN comm 含图拓扑结构的通讯器 OUT nnode 图拓扑结构中结点总数 OUT nedge 图拓扑结构中边总数

MPI进程拓扑结构 MPI_Graph_get 图拓扑结构查询函数,查询图拓扑结构包含的邻居结点数组和边数组 MPI_Graph_get (comm, maxindexs, maxedges, indexs, edges) IN comm 含图拓扑结构的通讯器 IN maxindexs 图拓扑结构包含的结点总数 IN maxedges 数组edges的长度,边条数的二倍 OUT indexs 图拓扑结构的邻居结点数组 OUT edges 图拓扑结构的边数组

MPI进程组与通讯器

MPI进程拓扑结构 MPI_Graph_neighbors_count 图拓扑结构查询函数,返回某个进程的邻居结点数。 MPI_Graph_neighbors_count (comm, rank, nneighbor) IN comm 含图拓扑结构的通讯器 IN rank 进程序号 OUT nneighbor 进程rank的邻居结点数

MPI进程拓扑结构 MPI_Graph_neighbors 图拓扑结构查询函数,返回某个进程的所有邻居结点。 MPI_Graph_neighbors (comm, rank, maxneighbors, neighbors) IN comm 含图拓扑结构的通讯器 IN rank 进程序号 IN maxneighbors 数组neighbors的长度 OUT neighbors 进程rank所有邻居结点序号组成的数组 通讯器comm中进程rank的所有邻居结点,按照从小到大的序号,将结点存储在neighbors数组中。

MPI进程组与通讯器

MPI进程拓扑结构 MPI_Graph_map 图拓扑结构映射函数,为每个进程映射一个新的序号。 MPI_Graph_map (comm, nnode, index, edges, newrank) IN comm 通讯器 IN nnode 图拓扑结构的结点总数 IN index 图拓扑结构的邻居结点数组 IN edges 图拓扑结构的边数组 OUT newrank 新的进程序号

MPI进程组与通讯器

MPI进程拓扑结构 MPI_Topo_test 拓扑结构类型查询函数,返回某个通讯器包含的拓扑结构的类型。 MPI_Topo_test (comm, type) IN comm 通讯器 OUT type 通讯器包含的拓扑结构类型

MPI进程拓扑结构 type = MPI_GRAPH 通讯器包含图拓扑结构 type = MPI_CART 通讯器包含Cartesian拓扑结构 type = MPI_UNDEFINED 通讯器不包含任何拓扑结构 例: MPI_Topo_test (MPI_COMM_WORLD, type) type = MPI_UNDEFINED

1. https://computing.llnl.gov/tutorials/mpi/ 2.

谢谢大家