我在一个多线程程序中有一个MPI_Isend/MPI_Recv problem。
在该方案中:
第一台机器有一个线程执行一些计算,并调用MPI_Isend将缓冲区发送到第二台机器,而另一个线程总是试图从第二台机器上发送MPI_Recv数据。第一个线程将在再次调用MPI_Wait之前完成它的最后一个MPI_Isend。
,第二台机器,也做同样的事情。
我得到的结果是:
第一台机器
线程:成功地将MPI_Isend数据发送到第二台计算机。但是在MPI_Wait中被阻止了,因为上一次MPI_Isend没有完成。
线程1:尝试从第二台计算机中获取MPI_Recv数据,但是没有数据,并且它被阻塞了。
第二台机器
线程:成功地将MPI_Isend数据发送到第一台计算机。但是在MPI_Wait中被阻止了,因为上一次MPI_Isend没有完成。
线程1:尝试从第一台计算机中获取MPI_Recv数据,但是没有数据,并且它被阻塞了。
有人有什么想法吗?我非常感激它,因为我已经追踪这个问题两天了,但没有任何进展。
发布于 2012-12-05 11:32:38
为了能够同时执行MPI调用,您必须在MPI_THREAD_MULTIPLE级别上初始化支持线程的MPI库。为此,必须将对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调用的延迟,如果他的程序不使用线程,那么没有人愿意这样做。
https://stackoverflow.com/questions/13722160
复制相似问题