多线程程序中的MPI_Isend / MPI_Recv

时间:2012-12-05 11:23:19

标签: c++ multithreading openmpi

我在多线程程序中有 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数据,但没有数据并且已被阻止。

有没有人有任何想法?我非常感激,因为我已经跟踪了这个问题两天但没有进展。

1 个答案:

答案 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调用的延迟,如果他的程序不使用线程,则没有人想要它。