MPI六大指令
MPI_INIT
启动MPI
MPI_INIT(ierr)
MPI_COMM_SIZE,
得知参与并行计算的CPU core个数 number of core
CALL MPI_COMM_SIZE (MPI_COMM_WORLD, NPROC, IERROR)
in comm 通信域
out size 通信域comm内包括的进程数
MPI_COMM_RANK,
以得知是第几个core (MYID)从0开始
MPI_COMM_RANK(comm,rank,IERROR)
in comm 该进程所在的通信域
out rank 调用进程在comm中的标识号
MPI_SEND,
将发送缓冲区中的count个datatype数据类型的数据发送到目的进程
目的进程在通信域中的标识号是dest
本次发送的消息标志是tag
使用这一标志就可以把本次发送的消息和本进程向同一目的进程发送的其它消息区别开来
MPI_SEND(buf,count,datatype,dest,tag,comm,IERROR)
in buf 发送缓冲区的起始地址(可选类型)
in count 将发送的数据的个数(非负整数)
in datatype 发送数据的数据类型(句柄)
in dest 目的进程标识号(整型)
in tag 消息标志(整型)
in comm 通信域(句柄)
MPI_RECV,
MPI_RECV从指定的进程source接收消息
并且该消息的数据类型和消息标识和本接收
进程指定的datatype和tag相一致
接收到的消息所包含的数据元素的个数最多不能超过count
MPI_RECV(buf,count,datatype,source,tag,comm,status,IERROR)
OUT buf 接收缓冲区的起始地址(可选数据类型)
IN count 最多可接收的数据的个数(整型)
IN datatype 接收数据的数据类型(句柄)
IN source 接收数据的来源即发送数据的进程的进程标识号(整型)
IN tag 消息标识 与相应的发送操作的表示相匹配相同(整型)
IN comm 本进程和发送进程所在的通信域(句柄)
OUT status 返回状态 (状态类型)
MPI_FINALIZE,
结束
MPI_FINALIZE(ERROR)
其它指令
MPI_WTIME()
当前时间
MPI_WTIME(time)
MPI_GET_PROCESSOR_NAME()
获取机器的名字
MPI_GET_PROCESSOR_NAME(NAME, RESULTLEN, IERROR)
OUT name 当前进程所运行机器的名字
OUT resultlen 返回名字的的长度 以可打印字符的形式
MPI_GET_VERSION()
获取版本号
MPI_GET_VERSION(VERSION, SUBVERSION,IERROR)
OUT version
OUT subversion
1对等模式
2主从模式
四种通信方式
1,标准通信模式 standard mode
MPI_SEND
是否对发送的数据进行缓存是由MPI自身决定的 而不是由并行程序员来控制
如果MPI决定缓存将要发出的数据
发送操作不管接收操作是否执行都可以进行
且发送操作可以正确返回而不要求接收操作收到发送的数据
2,缓存通信模式 buffered- mode
MPI_BSEND
直接对通信缓冲区进行控制
MPI_BSEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERROR)
IN buf 发送缓冲区的起始地址(可选数据类型)
IN count 发送数据的个数(整型)
IN datatype 发送数据的数据类型(句柄)
IN dest 目标进程标识号(整型)
IN tag 消息标志(整型)
IN comm 通信域(句柄)
MPI_BUFFER_ATTACH()
MPI_BUFFER_ATTACH将大小为size的缓冲区递交给MPI
这样该缓冲区就可以作为缓存发送时的缓存来使用
MPI_BUFFER_ATTACH( BUFFER, SIZE, IERROR)
IN buffer 初始缓存地址(可选数据类型)
IN size 按字节计数的缓存跨度(整型)
MPI_BUFFER_DETACH()
MPI_BUFFER_DETACH将提交的大小为size的缓冲区buffer收回
该调用是阻塞调用它一直等到使用该缓存的消息发送完成后才返回
这一调用返回后用户可以重新使用该缓冲区或者将这一缓冲区释放
MPI_BUFFER_DETACH( BUFFER, SIZE, IERROR)
OUT buffer 缓冲区初始地址(可选数据类型)
OUT size 以字节为单位的缓冲区大小(整型)
3,同步通信模式 synchronous-mode
MPI_SSEND
同步通信模式的开始不依赖于接收进程相应的接收操作是否已经启动
但是同步发送却必须等到相应的接收进程开始后才可以正确返回
MPI_SSEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERROR)
IN buf 发送缓冲区的初始地址(可选数据类型)
IN count 发送数据的个数(整型)
IN datatype 发送数据的数据类型(句柄)
IN dest 目标进程号(整型)
IN tag 消息标识(整型)
IN comm 通信域(句柄)
4,就绪通信模式 ready-mode
MPI_RSEND
只有当接收进程的接收操作已经启动时才可以在发送进程启动发送操作
当发送操作启动而相应的接收还没有启动时发送操作将出错
MPI_RSEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERROR)
IN buf 发送缓冲区的初始地址(可选数据类型)
IN count 将发送数据的个数(整型)
IN datatype 发送数据的数据类型(句柄)
IN dest 目标进程标识(整型)
IN tag 消息标识(整型)
IN comm 通信域(句柄)
组通信
1广播
MPI_BCAST
MPI_BCAST是一对多组通信的典型例子
它完成从一个标识为root的进程将一条消息
广播发送到组内的所有其它的进程
同时也包括它本身在内
MPI_BCAST(BUFFER,COUNT,DATATYPE,ROOT,COMM,IERROR)
IN/OUT buffer 通信消息缓冲区的起始地址(可选数据类型)
IN count 将广播出去/或接收的数据个数(整型)
IN datatype 广播/接收数据的数据类型(句柄)
IN root 广播数据的根进程的标识号(整型)
IN comm 通信域(句柄)
2收集
MPI_GATHER
收集MPI_GATHER是典型的多对一通信的例子 在收集调用中
每个进程包括根进程本身
将其发送缓冲区中的消息发送到根进程
根进程根据发送进程的进程标识的序号即进程的rank值
将它们各自的消息依次存放到自已的消息缓冲区中
和广播调用不同的是广播出去的数据都是相同的
但对于收集操作虽然从各个进程收集到的数据的个数必须相同
但从各个进程收集到的数据一般是互不相同的
其结果就象一个进程组中的N个进程包括根进程在内都执行了一个发送调用
同时根进程执行了N次接收调用
MPI_GATHER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,
RECVTYPE,ROOT, COMM, IERROR)
IN sendbuf 发送消息缓冲区的起始地址(可选数据类型)
IN sendcount 发送消息缓冲区中的数据个数(整型)
IN sendtype 发送消息缓冲区中的数据类型(句柄)
OUT recvbuf 接收消息缓冲区的起始地址(可选数据类型)
IN recvcount 待接收的元素个数(整型,仅对于根进程有意义)
IN recvtype 接收元素的数据类型(句柄,仅对于根进程有意义)
IN root 接收进程的序列号(整型)
IN comm 通信域(句柄)
3散发
MPI_SCATTER
是一对多的组通信调用
但是和广播不同ROOT向各个进程发送的数据可以是不同的
MPI_SCATTER和MPI_GATHER的效果正好相反
两者互为逆操作
MPI_SCATTER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,RECVTYPE, ROOT, COMM, IERROR)
IN sendbuf 发送消息缓冲区的起始地址(可选数据类型)
IN sendcount 发送到各个进程的数据个数(整型)
IN sendtype 发送消息缓冲区中的数据类型(句柄)
OUT recvbuf 接收消息缓冲区的起始地址(可选数据类型)
IN recvcount 待接收的元素个数(整型)
IN recvtype 接收元素的数据类型(句柄)
IN root 发送进程的序列号(整型)
IN comm 通信域(句柄)
4组收集
MPI_GATHER
将数据收集到ROOT进程而MPI_ALLGATHER相当于每一个进程都作为ROOT执行了一次MPI_GATHER调用
即每一个进程都收集到了其它所有进程的数据
从参数上看 MPI_ALLGATHER 和MPI_GATHER完全相同
只不过在执行效果上 对于 MPI_GATHER执行结束后
只有ROOT进程的接收缓冲区有意义
MPI_ALLGATHER调用结束后所有进程的接收缓冲区都有意义
它们接收缓冲区的内容是相同的
MPI_ALLGATHER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,RECVTYPE, COMM, IERROR)
IN sendbuf 发送消息缓冲区的起始地址(可选数据类型)
IN sendcount 发送消息缓冲区中的数据个数(整型)
IN sendtype 发送消息缓冲区中的数据类型(句柄)
OUT recvbuf 接收消息缓冲区的起始地址(可选数据类型)
IN recvcount 从其它进程中接收的数据个数(整型)
IN recvtype 接收消息缓冲区的数据类型(句柄)
IN comm 通信域(句柄)
5全互换
MPI_ALLTOALL
组内进程之间完全的消息交换
其中每一个进程都相其它所有的进程发送消息
同时每一个进程都从其它所有的进程接收消息
MPI_ALLTOALL(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,RECVTYPE, COMM, IERROR)
IN sendbuf 发送消息缓冲区的起始地址(可选数据类型)
IN sendcount 发送到每个进程的数据个数(整型)
IN sendtype 发送消息缓冲区中的数据类型(句柄)
OUT recvbuf 接收消息缓冲区的起始地址(可选数据类型)
IN recvcount 从每个进程中接收的元素个数(整型)
IN recvtype 接收消息缓冲区的数据类型(句柄)
IN comm 通信域(句柄)
6同步
MPI_BARRIER
MPI_BARRIER
阻塞所有的调用者
直到所有的组成员都调用了它
各个进程中这个调用才可以返回
MPI_BARRIER(COMM, IERROR)
IN comm 通信域(句柄)