线程安全MPI通信

时间:2013-02-21 17:57:20

标签: c++ multithreading thread-safety mpi mutex

在我最近学到的related question中,一个人必须非常小心地使用多个线程进行通信的MPI。由于我使用的实施不支持MPI_THREAD_MULTIPLE,因此我只使用MPI::COMM_WORLD包裹了每个std::lock_guard<std::mutex>来电。

我现在的问题:这有点过分吗?具体来说:我可以在Send的确切时间Recv吗?

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

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

1 个答案:

答案 0 :(得分:0)

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