关于MPI补充之通信篇

注:这篇博客是针对我以前的一篇博客的补充,下面是以前那篇博客的地址:
http://blog.csdn.net/qq_35571432/article/details/78368797

MPI 类型匹配:我们注意到在MPI_Send,MPI_Recv等中都有一个参数datatype,用来匹配参数类型,比如MPI_CHAR只能匹配MPI_CHAR,但是有一个参数可以匹配所有类型,那就是MPI_PACKED(这是接收时,接受的类型和发送的类型的匹配)。
实际上,还有一个匹配,就是发送时和接收时你调用的函数的第一个参数和第三个参数的匹配(即你的存储和你接收到的内容的匹配),这里有两种类型可以进行任意匹配,MPI_BYTE或MPI_PACKED,MPI_PACKED顾名思义传输显式打包或者拆包的数据,MPI_BYTE允许我们传送不变的存储中的一个字节的二进制值。但是请注意最好保持发送和接受的总长度相等。
还是匹配的问题,以上函数中都有一个参数指示了元素数量,一种可以的匹配是接收函数设定数量大于等于发送函数实际发送的数量,但是不可以小于,否则会造成溢出。

关于MPI_Send,MPI_Rsend,MPI_Ssend,MPI_Bsend的关系
MPI_Send:标准的发送模式。
MPI_Bsend:缓存模式,即把数据存入到缓存中,而不必依赖匹配的接收,但是这样可能会占用大量的缓存,必要时需要分配缓存,例如可以通MPI_Buffer_attach(void*buffer,int size)分配缓存,注意这种方式分配的缓存只能用于缓存模式,而且同一进程同一时候只能连接一个缓存。使用完毕后使用MPI_Buffer_detach(void*buffer_addr,int size)释放缓存,detach是个堵塞操作
MPI_Rsend: ready模式,只有匹配的接收已经准备好之后,才可以调用这一个函数,这个函数与标准模式相比可以节省一些额外的系统开销。
MPI_Ssend:同步模式,当一个匹配到一个接收者并且开始接收时,同步模式就算完成,但是他的完成并不代表接收者已经完成接收,可以释放缓存,而且如果接收和发送都是堵塞的,这个可以提供同步语义。
另外以上四种都有对应的非堵塞版本,分别为:
MPI_Isend,MPI_Irsend,MPI_Issend,MPI_Ibsend
另外如果一个通信在一个并行计算的内部循环中不断地以同样的参数被执行。在这种情况下,该通信可以优化:把这些通信参数一次性捆绑到一个坚持式通信请求,然后不断用该请求初始化和完成消息:
这四个也有相应的坚持式通信函数:
MPI_Send_Init,MPI_Rsend_Init,MPI_Ssend_Init,MPI_Bsend_init

下面是一个可能的语义:
ready send: 只要一可能, 消息就被发送。
同步发送: 发送者发一个“请求发送”的消息。接收者存储这个请求。当一个匹配接收登入时,接收者发回一个“允许发送”的消息,这时接收者发送消息。   
标准发送: 第一个协议用于短的消息, 第二个协议用于长的消息。   
缓存模式: 发送者把消息拷贝到一个缓存, 然后以非阻塞方式发送它(使用与标准发送同样的协议)

同时通信中还要注意以下问题:
1.同线程中一个接收者不能跳过比他前面执行的接收者接收信息(除非他之前的接收者都调用完毕),多线程不受此约束
2.MPI不负责接收的可靠性,比如某个进程可以多次挂起接收函数但一次都没有收到。
3.当资源不足时,MPI调用会被阻止
4.注意由于以上限制程序产生的死锁现象,同时注意由于缓存不足导致的死锁现象。
5.非堵塞通信凭借重叠机制可以获得比较好的性能,在一个非堵塞方法完成之前,应该尽量避免访问这部分数据,可以用MPI_Test和MPI_Wait来完成它。
6.非堵塞方法中,也存在着先发送匹配先接收的情况。

MPI_Probe,探针,可以检测即将接收的数据,当信息和MPI_Probe相匹配,会返回flag=true,如果需要的话,可以调用MPI_Cancel来取消接收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值