2

我在多线程程序中有MPI_Isend/MPI_Recv 问题。

在程序中:

第一台机器有一个线程进行一些计算并调用MPI_Isend以将缓冲区发送到第二台机器,而另一个线程总是试图MPI_Recv从第二台机器获取数据。第一个线程将在再次调用之前MPI_Wait最后MPI_Isend完成MPI_Isend

第二台机器做同样的事情。

然后我得到的结果是:

第一台机器

线程0MPI_Isend数据成功到第二台机器。但MPI_Wait因为最后MPI_Isend没有完成而被阻止。

线程1:尝试MPI_Recv从第二台机器获取数据,但没有数据,它被阻塞了。

第二台机器

线程0 :MPI_Isend数据到第一台机器成功。但MPI_Wait因为最后MPI_Isend没有完成而被阻止。

线程1:尝试MPI_Recv从第一台机器获取数据,但没有数据,它被阻塞了。

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

4

1 回答 1

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 调用的延迟,如果他的程序不使用线程,没有人希望这样。

于 2012-12-05T11:32:38.707 回答