所以我正在编写一个程序来在进程之间弹跳“虚拟球”。根进程(即排名为 0 的任务)初始化游戏,然后将其发送到由 rand() % size
确定的随机进程(使用初始排名作为种子生成的随机数)。
我尝试过这样做:
int rnk= rand() % 大小;
MPI_Send(&ball,1, MPI_INT, rnk, MPI_COMM_WORLD);
这会将球发送到下一个随机进程,但在运行此代码时,代码会被阻塞的 MPI_Send 阻止。我刚刚开始并行编程,所以对此还没有足够的掌握。我如何发送到随机进程,然后他们进一步将其发送到任何随机进程?
欢迎任何指点、技巧、书籍和教程。
最佳答案
如果根最初尝试发送给自身,则会出现问题(由于 rand()%size 可能为零,因此可能会发生这种情况)。
- 如果您首先将接收发送到根,那么它将阻塞,因为它永远不会到达发送调用(如上面@Gregor 所指出的);
- 但是,如果您首先将发送发送到根,则无法保证它将永远进行到接收调用,因为 MPI_Send() 不保证是异步的(即它可能是实现为同步发送,它将永远等待匹配的接收)。
您需要确保发送方永远不会向自身发送数据,或者使用非阻塞发送(或非阻塞接收)来避免潜在的死锁。
关于c - MPI 中的不同进程之间发送和接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39459092/