2

在我最近了解到的一个相关问题中,必须非常小心地使用 MPI 与多个线程通信。由于我使用的实现不支持MPI_THREAD_MULTIPLE,所以我只是MPI::COMM_WORLDstd::lock_guard<std::mutex>.

我现在的问题是:这是矫枉过正吗?具体来说:我可以在我Send的确切时间Recv吗?

我尝试了两个std::mutex,一个用于发送,一个用于接收。在我的测试机器上,我进行了几次测试运行而没有错误,但这不能保证,这可能只是巧合..

补充:现在 - 通过数百次测试运行 - 实际上发生了一个糟糕的分段错误,但我不能 100% 确定这是否是由于同时发送/接收。

4

1 回答 1

0

您使用的是哪种 MPI 线程模式?除非您使用 ,否则使用互斥锁是不够的MPI_THREAD_SERIALIZED,在这种情况下,您需要在所有 MPI 调用周围使用单个互斥锁。如您所见,这确实使它们序列化。如果你不使用MPI_Init_threadwith MPI_THREAD_SERIALIZED(即你正在使用MPI_Init或一些较低的线程设置),即使使用互斥锁也是不够的;有关确切限制,请参阅 MPI 标准。如果您使用MPI_THREAD_SERIALIZED,则规则是您不能同时输入来自多个线程的 MPI 调用,无论它们是相同的操作还是不同的操作。

于 2013-07-07T06:05:35.190 回答