首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >其他进程挂起在MPI_Sendrecv之后

其他进程挂起在MPI_Sendrecv之后
EN

Stack Overflow用户
提问于 2012-11-09 11:03:43
回答 1查看 727关注 0票数 0

我认为使用MPI_Sendrecv

代码语言:javascript
运行
复制
MPI_Sendrecv(&ballPos, 2, MPI_INT, FIELD, NEW_BALL_POS_TAG, &ballPos, 2, MPI_INT, winner, NEW_BALL_POS_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

但我只注意到了根源(接受者继续参选?)。让cout在Sendrecv之前和之后产生:

代码语言:javascript
运行
复制
0 b4 sendrecv
2 b4 sendrecv
4 b4 sendrecv
1 b4 sendrecv
3 b4 sendrecv
5 b4 sendrecv
0 after sendrecv

在sendrecv之前,所有进程都正常,但之后只有根解块。

全源:参见第147行

更新

其结果应该类似于以下内容

代码语言:javascript
运行
复制
if (rank == winner) {
    ballPos[0] = rand() % 128;
    ballPos[1] = rand() % 64;
    cout << "new ball pos: " << ballPos[0] << " " << ballPos[1] << endl;
    MPI_Send(&ballPos, 2, MPI_INT, FIELD, NEW_BALL_POS_TAG, MPI_COMM_WORLD);
} else if (rank == FIELD) {
    MPI_Recv(&ballPos, 2, MPI_INT, winner, NEW_BALL_POS_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-09 11:24:19

发送发送的数量应该等于发送的数量。在您的情况下,所有的等级都被发送到FIELD级别,并从等级winner接收,包括FIELDwinner

代码语言:javascript
运行
复制
Rank       Sends to  Receives from
----------------------------------
0 (FIELD)  FIELD     winner
1          FIELD     winner
2          FIELD     winner
...        ...       ...
winner     FIELD     winner
...        ...       ...
numprocs-1 FIELD     winner

(这类表格有时可能非常有用)

因此,FIELD应该接收numprocs消息,但它只执行MPI_Sendrecv一次,因此对MPI_Sendrecvnumprocs-1调用将无法完成它们的发送。winner也是如此。它应该发送numprocs消息,但是由于它只执行MPI_Sendrecv一次,所以只发送了一条消息,因此对MPI_Sendrecvnumprocs-1调用无法完成接收。

还有另一个错误。MPI标准要求发送和接收缓冲区是不相交的(即它们不应该重叠),这与您的代码不同。您的发送和接收缓冲区不仅重叠,而且它们是同一个缓冲区。如果您想在同一个缓冲区中执行交换,MPI将提供MPI_Sendrecv_replace操作。

我不知道您试图用这个MPI_Sendrecv语句实现什么,但我强烈怀疑您需要将它放入if语句中。

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

https://stackoverflow.com/questions/13306867

复制
相关文章

相似问题

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