我在多线程程序中有 MPI_Isend / MPI_Recv问题。
在该计划中:
第一台机器有一个线程进行一些计算并调用MPI_Isend
将缓冲区发送到第二台机器,而另一个线程总是尝试从第二台机器发送MPI_Recv
数据机。并且第一个帖子将MPI_Wait
在完成MPI_Isend
之前完成其最后MPI_Isend
次。
第二台机器做同样的事情。
然后我得到了结果:
第一台机器:
将 0 :MPI_Isend
数据线程成功传输到第二台计算机。但由于最后MPI_Wait
未完成,因此在MPI_Isend
中被屏蔽了。
主题 1 :尝试来自第二台计算机的MPI_Recv
数据,但没有数据并且已被阻止。
第二台机器:
将 0 :MPI_Isend
数据线程成功传输到第一台计算机。但由于最后MPI_Wait
未完成,因此在MPI_Isend
中被屏蔽了。
主题 1 :尝试来自第一台计算机的MPI_Recv
数据,但没有数据并且已被阻止。
有没有人有任何想法?我非常感激,因为我已经跟踪了这个问题两天但没有进展。
答案 0 :(得分:2)
为了能够同时执行MPI调用,您必须初始化MPI库,并支持级别为MPI_THREAD_MULTIPLE
的线程。为此,您必须将对MPI_Init
的调用替换为:
int provided;
MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
if (provided != MPI_THREAD_MULTIPLE)
{
printf("Sorry, this MPI implementation does not support multiple threads\n");
MPI_Abort(MPI_COMM_WORLD, 1);
}
某些MPI库必须以某种(非默认)方式进行编译,以支持来自多个线程的调用。例如,必须在库构建时配置Open MPI。其他供应商提供了两个版本的库 - 一个支持线程,另一个没有,你必须在链接代码时选择正确的库。这是因为添加对线程的支持会增加许多MPI调用的延迟,如果他的程序不使用线程,则没有人想要它。