首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程程序中的MPI_Isend/MPI_Recv

多线程程序中的MPI_Isend/MPI_Recv
EN

Stack Overflow用户
提问于 2012-12-05 11:23:19
回答 1查看 1.5K关注 0票数 2

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-05 11:32:38

为了能够同时执行MPI调用,您必须在MPI_THREAD_MULTIPLE级别上初始化支持线程的MPI库。为此,必须将对MPI_Init的调用替换为:

代码语言:javascript
复制
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调用的延迟,如果他的程序不使用线程,那么没有人愿意这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13722160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档