c++ - 使用 MPI_Gather 导致无法附加到引导队列错误
问题描述
我需要编写代码,将矩阵列从每个进程发送到根进程。
我有以下代码:
int task8(int argc, char* argv[])
{
int rank, size;
double matrix[100][150];
double result_matrix[100][150];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// generate matrix
srand((int)(MPI_Wtime() * 1e4));
for (int i = 0; i < 100; ++i)
{
for (int j = 0; j < 150; ++j)
{
matrix[i][j] = rand();
}
}
if (rank != 0)
{
// for (int i = rank; i < 100; i += size)
// {
// MPI_Gather(&matrix[i], 150, MPI_DOUBLE, &matrix[i], 150, MPI_DOUBLE, 0, MPI_COMM_WORLD);
// }
// for (int i = 0; i <= size; i++)
// {
// MPI_Gather(&matrix[i], 150, MPI_DOUBLE, &result_matrix[i], 150, MPI_DOUBLE, 0, MPI_COMM_WORLD);
// }
MPI_Gather(matrix[rank], 150, MPI_DOUBLE, result_matrix[rank], 150, MPI_DOUBLE, 0, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
但我不明白为什么曾经突出显示的示例不起作用 - 它会产生错误:
C:\Users\Dima>mpiexec -n 4 D:\code\parallel\labs_exam\Project1\Debug\Project1.exe
job aborted:
[ranks] message
[0-1] terminated
[2] fatal error
Fatal error in MPI_Gather: Other MPI error, error stack:
MPI_Gather(sbuf=0x00212AB0, scount=150, MPI_DOUBLE, rbuf=0x001F55E8, rcount=150, MPI_DOUBLE, root=0, MPI_COMM_WORLD) failed
failed to attach to a bootstrap queue - 11660:216
[3] terminated
---- error analysis -----
[2] on DESKTOP-5SK57UV
mpi has detected a fatal error and aborted D:\code\parallel\labs_exam\Project1\Debug\Project1.exe
---- error analysis -----
我已经尝试运行 mpi 文档中的简单示例,这些示例使用了 MPI_gather 函数并且它们工作正常。
解决方案
MPI_Gather()
是一个集体操作,因此必须在通信器的所有等级上调用(使用兼容的参数)。
在您的程序中,rank0
不会调用MPI_Gather()
,因此您的程序将死锁或中止。
推荐阅读
- javascript - 使用 Redux Toolkit 在切片之间共享操作
- javascript - 使用新文档 ID 更新 mongodb 文档
- html - 如何防止我网站中的视频在 ipad 上以 PIP 模式播放?
- c++ - 是否可以 dllexport 已通过 using-declaration 访问的方法?
- java - 如何验证是否显示 toast 消息?
- mongodb - Mongodb聚合数组分区和计数
- java - Wildfly 23/24 (Jakarta JWS) 中禁用了 WebServices 子系统
- google-cloud-platform - 如果不是为了模拟,“服务帐户用户”角色的意义何在?
- input - 为什么输入(colorPicker)只支持Hex?
- python - 尝试复制已经工作的代码,但在导入过程中遇到错误