我正在使用MPI(Fortran,但问题比MPI标准更特定于任何给定语言),特别是使用缓冲发送/接收函数isend和irecv。现在,如果我们想象以下场景:MPI缓冲发送/接收指令
进程0:
isend(stuff1, ...)
isend(stuff2, ...)
流程1:
wait 10 seconds
irecv(in1, ...)
irecv(in2, ...)
交付在他们被送了以处理1的信息,即我可以确定in1 == stuff1和in2 == stuff2 如果使用的标签在所有情况下都是相同的?
必须-1,因为我不能相信你的“是”和“否”答案中的“否”部分......用你在那里建议的方式“检查完成”是很荒唐的。等价地,如果我问你“是否是x = 42; printf(”%d“,x);'保证打印42?你可以说“是,否,否则,因为如果你是通过调试器进行单步调试,并改变了'x'的值,那么它就不会。” – 2010-03-28 06:41:22
@j ...描述的情况发生在我支持的三个不同的用户身上。他们的工作具有多线程级别,只有一个MPI通信线程。其他线程正在与硬件控制器交互。硬件控制器线程正在检查缓冲区的最后一位以确定消息完成。当他们从TCP移动到IB时,显示了无序的消息到达问题。这更像是一个“编译器优化”,而不是你给出的调试器例子。结构管理器保存缓冲区顺序,但优化了实际的传输顺序。 – 2010-03-29 15:47:55
好吧,我惊呆了。 (这就是MPI_Test()用于*!)但是,如果3个用户得到了这个错误,那么你的帖子中的信息是有价值的,所以如果你编辑它来添加一个大声的“但不要做这个,它是愚蠢的”或有些,我会+1。 – 2010-04-02 10:49:58