2013-02-21 48 views
2

related question笔者近日了解到,一个具有使用MPI与多个线程沟通要非常小心。由于我使用不支持MPI_THREAD_MULTIPLE实施,我刚刚结束的每MPI::COMM_WORLD调用了std::lock_guard<std::mutex>线程安全的MPI通信

我现在的问题:这是大材小用?具体而言:我可以在Send准确时间我Recv

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

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

+0

你是否在网络上试过这个?在本地测试机器上它可能表现不同,消息发送/接收时间不是确定性的,互斥锁/解锁也不是确定性的。 – pyCthon 2013-02-23 06:21:41

+0

@pyCthon我只在本地执行了这个操作,但似乎甚至失败了。可悲的是,不同的传播者也不是解决方案。 – stefan 2013-02-23 14:18:24

回答

0

其中MPI的线程模式是您使用?除非您使用MPI_THREAD_SERIALIZED,否则使用互斥锁是不够的,在这种情况下,您将需要围绕所有MPI调用使用单个互斥锁。正如你所看到的那样,它会将它们序列化。如果你不使用MPI_Init_threadMPI_THREAD_SERIALIZED(即您使用MPI_Init或某些底线设置),即使使用互斥量是不够的;请参阅MPI标准以了解确切的限制。如果您使用的是MPI_THREAD_SERIALIZED,则规则是不能同时从多个线程输入MPI调用,无论它们是相同的操作还是不同的。

+0

我不明白为什么'std :: mutex'和'MPI_Init'应该不够用。这有效地将调用序列化为MPI通信,因此它不会与单线程使用情况有所不同。不同的说法意味着使用'MPI_Init'永远不安全。你能澄清一下吗? – stefan 2013-07-10 09:28:47

+0

如果你的程序使用线程(即使它不使用其他线程的MPI),使用普通的'MPI_Init'是不安全的。 – 2013-07-10 18:12:05

+0

有关不同线程级别的规则,请参见MPI 3.0标准(http://www.mpi-forum.org/docs/mpi-3.0/mpi30-report.pdf)的12.4.3节(页面486的顶部)。 – 2013-07-10 18:15:01