在我最近学到的related question中,一个人必须非常小心地使用多个线程进行通信的MPI。由于我使用的实施不支持MPI_THREAD_MULTIPLE
,因此我只使用MPI::COMM_WORLD
包裹了每个std::lock_guard<std::mutex>
来电。
我现在的问题:这有点过分吗?具体来说:我可以在Send
的确切时间Recv
吗?
我尝试了两个std::mutex
,一个用于发送,一个用于接收。在我的测试机器上,我有几次没有错误的测试运行,但这不是保证,它可能只是巧合..
补充:现在 - 有数百次测试运行 - 实际上发生了一个糟糕的分段错误,但我不能100%确定这是否是由于同时发送/接收。
答案 0 :(得分:0)
您使用哪种MPI线程模式?除非使用MPI_THREAD_SERIALIZED
,否则使用互斥锁是不够的,在这种情况下,您需要在所有MPI调用周围使用一个互斥锁。正如你所看到的那样,它确实将它们序列化。如果您未将MPI_Init_thread
与MPI_THREAD_SERIALIZED
一起使用(即,您正在使用MPI_Init
或某种较低线程设置),即使使用互斥锁也是不够的;有关确切的限制,请参阅MPI标准。如果您使用MPI_THREAD_SERIALIZED
,则规则是您无法同时从多个线程输入MPI调用,无论它们是相同的操作还是不同。