MPI学习笔记

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  通信域(句柄)
                

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值