mpi - MPI_SendRecv 执行时死锁
问题描述
我正在尝试使用 MPI_Sendrecv 从偏移处理器以环形方式将信息从一个处理器发送到另一个处理器,但我遇到了死锁。我的代码有什么问题?基本上我需要使用 MPI_SendRecv 来解决这类问题。
#include <stdio.h>
#include <unistd.h>
#include <mpi.h>
int main (int argc, char *argv[])
{
int offset = 9;
int size, rank, value, next, prev, sendval, recval, namelen;
double t0, t;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Get_processor_name(processor_name, &namelen);
value = 5;
if (size > 1)
{
next = (rank + 1)% size;
prev = (size+rank - 1)% size;
sendval = value + rank;
if (rank == offset)
{
MPI_Sendrecv(&sendval, 1, MPI_INT, next, 1, &recval, 1, MPI_INT, prev, 10, MPI_COMM_WORLD, &status);
}
else
{
MPI_Recv(&recval, 1, MPI_INT, prev, 10, MPI_COMM_WORLD, &status);
MPI_Send(&sendval, 1, MPI_INT, next, 10, MPI_COMM_WORLD);
}
}
MPI_Finalize();
return 0;
}
解决方案
您的消息标签不匹配:
MPI_Sendrecv(&sendval, 1, MPI_INT, next, 1, &recval, 1, MPI_INT, prev, 10, MPI_COMM_WORLD, &status);
// ^
...
MPI_Recv(&recval, 1, MPI_INT, prev, 10, MPI_COMM_WORLD, &status);
// ^^
发送-接收操作的发送部分中的标签也应该是10
.
推荐阅读
- sql - 对象引用未设置为 .net 核心中的对象实例
- firebase - firebase_app_distribution 无法分发给 CirclceCI 上的测试人员组
- perl - 构建 dssp 时找不到 Data/Dumper.pm - perl 已安装但找不到?
- tableau-api - 在 TABLEAU 中调用列名称的函数
- r - R中的正则表达式,在替换中重用匹配的字符串
- accessibility - 网站中的所有可下载文档(word doc、ppt、pdf 等)是否都可以访问以符合 WCAG?
- apache-flink - onTimer 方法,为什么定时器状态为空?
- node.js - 无法运行 npm install 命令
- python - 我怎样才能避免制作两个 tkinter 窗口?
- laravel - 公共 Laravel API 的身份验证