说我有这样的3个非阻塞发送
- MPI_Isend();
- MPI_Isend();
- MPI_Isend();
醇>
和3对应的接收
- MPI_RECV();
- MPI_RECV();
- MPI_RECV();
醇>
现在假设第二个Isend没有发送,因为它的非阻塞第三个将被发送。现在,MPI_Recv函数是否会成为预期函数?
我的意思是第一个MPI_ISend将数据发送到第一个接收,第二个MPI_ISent发送到第二个MPI_Recv,依此类推。
答案 0 :(得分:0)
更新了 :以下评论中的Jeremiah Willcock我认为是对的,这个答案是错误的。
如果三个ISend被顺序调用,并且receive都匹配它们,那么一个发送操作是更大,更快,还是其他什么并不重要; MPI的非超车保证会告诉您消息将按照Isends的顺序到达(因此可用于Recv)。
如果对ISend的调用被延迟,这是我最初解释问题的方式,或者是否按照建议调用失败(但请注意,如果调用失败,您将在以后遇到其他问题)然后原始答案成立:如果Recieves匹配任何所有Isend,并且调用到第二个ISend以某种方式被阻止,那么第一个MPI_Recv()将得到第一个Isend,第二个Recv将得到第三个Isend,第三个将挂起,直到第二个Isend发生。
如果要确保第一个MPI_Recv收到特定消息,则应使用标记来区分各种消息,并让接收指定该标记。