gpt4 book ai didi

c++ - 多线程程序中的MPI_Isend/MPI_Recv

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:53:02 25 4
gpt4 key购买 nike

我在多线程 程序中遇到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数据,但是没有数据,它被阻塞了。

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

最佳答案

为了能够并发执行 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 调用的延迟,如果他的程序不使用线程,没有人希望出现这种情况。

关于c++ - 多线程程序中的MPI_Isend/MPI_Recv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13722160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com