我在MPI程序中使用pthreads时遇到问题。我的程序运行良好,不涉及pthreads。但是我决定并行执行一个耗时的操作,因此我创建了一个执行以下操作的pthread(MPI_Probe,MPI_Get_count和MPI_Recv)。我的程序在MPI_Probe失败,并且没有返回错误代码。这就是我初始化MPI环境的方法
MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided_threading_support);
提供的线程支持是'我假设是MPI_THREAD_SERIALIZED。关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
提供的线程支持是'我假设是MPI_THREAD_SERIALIZED。
MPI标准将线程支持级别定义为命名常量,并且只要求它们的值是单调的,即MPI_THREAD_SINGLE
< MPI_THREAD_FUNNELED
< MPI_THREAD_SERIALIZED
< MPI_THREAD_MULTIPLE
。实际数值是特定于实现的,不应使用或与之比较。
默认情况下,MPI通信调用永远不会返回MPI_SUCCESS
以外的错误代码。原因是,MPI在MPI调用返回之前调用通信器的错误处理程序,并且最初创建所有通信器时安装了MPI_ERRORS_ARE_FATAL
作为其错误处理程序。该错误处理程序终止程序并且通常打印一些调试信息,例如,失败的原因。 MPICH(及其无数变种)和Open MPI都会就导致终止的原因提供相当精细的报告。
要在通讯器comm
上启用用户错误处理,您应进行以下调用:
MPI_Comm_set_errhandler(comm, MPI_ERRORS_RETURN);
注意返回的错误代码 - 它们的数值也是特定于实现的。
答案 1 :(得分:-1)
如果你的MPI实现不愿意给你MPI_THREAD_MULTIPLE,你可以做三件事:
我建议#3。 MPI 的重点是并行性 - 如果你发现自己为单个MPI子进程创建多个线程,你应该考虑这些线程是否应该是独立的子进程开始。
特别是MPI_THREAD_MULTIPLE。如果您的线程是主子进程线程的子子进程工作者,我可能会看到MPI_THREAD_SERIALIZED的用途......但MULTIPLE意味着您在所有地方都在抛出数据。这就失去了MPI提供的主要便利,即同步。你会发现自己基本上是在MPI上重新实现MPI。
好的,既然你已经阅读了所有内容,那么妙语:3 MPI_THREAD_MULTIPLE。不过实话说。重新考虑你的架构。