MPI:为什么在下一个示例中使用MPI_Barrier时出现错误
MPI: Why I have the error when I using MPI_Barrier in the next example?
我是MPI的新手,我想做一个问题,我有两个数组a和B,有15个元素,我有16个进程,每个进程代表数组中的一个元素(我不使用进程零)。数组A存储了位置8…15的输入数据,其中这些位置代表树的叶子,在第一步中,我在数组中进行压缩,其中叶子将数字发送给父母,父母从所有子中接收,并将数字相加并发送给父亲。数组A在过程1中完成,其中是数组中所有元素的总和。在第二步中,我进行前缀计算,从过程0开始,到叶子结束。为了计算数组B,所有其他进程都需要等待进程1完成工作,为此,我使用MPI_Barrier,但在执行代码时出错。
int m = 3;
int n = (int)pow(2, m);
int *A = (int*)malloc(2 * n * sizeof(int));
int *B = (int*)malloc(2 * n * sizeof(int));
int id;
MPI_Status status;
A[8] = 4; A[9] = 8; A[10] = 5; A[11] = 2;
A[12] = 10; A[13] = 6; A[14] = 9; A[15] = 11;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &id);
if (id == 1)
{
int nr;
int suma = 0;
MPI_Recv(&nr, 1, MPI_INT, 2 * id, 99, MPI_COMM_WORLD, &status);
suma += nr;
MPI_Recv(&nr, 1, MPI_INT, 2 * id + 1, 99, MPI_COMM_WORLD, &status);
suma += nr;
A[id] = suma;
printf("A[%d]=%dn", id, A[id]);
B[id] = A[id];
printf("B[%d]=%dn", id, B[id]);
MPI_Barrier(MPI_COMM_WORLD);
}
else
{
if (id != 0)
{
if(id >= 8)
{
MPI_Send(&A[id], 1, MPI_INT, id / 2, 99, MPI_COMM_WORLD);
printf("%d a trimis %d catre %dn", id, A[id], id / 2);
MPI_Barrier(MPI_COMM_WORLD);
}
else
{
int nr;
int suma = 0;
MPI_Recv(&nr, 1, MPI_INT, 2 * id, 99, MPI_COMM_WORLD, &status);
suma += nr;
MPI_Recv(&nr, 1, MPI_INT, 2 * id + 1, 99, MPI_COMM_WORLD, &status);
suma += nr;
A[id] = suma;
MPI_Send(&A[id], 1, MPI_INT, id / 2, 99, MPI_COMM_WORLD);
printf("%d a trimis %d catre %dn", id, A[id], id / 2);
MPI_Barrier(MPI_COMM_WORLD);
}
if (id % 2 == 1)
{
B[id] = B[(id - 1) / 2];
printf("B[%d]=%dn", id, B[id]);
}
else
{
B[id] = B[id / 2] - A[id + 1];
printf("B[%d]=%dn", id, B[id]);
}
}
MPI_Finalize();
free(A);
return 0;
我收到下一个错误:
[15]致命错误
MPI_Barrier中的致命错误:其他MPI错误,错误堆栈:
MPI_Barrier(MPI_COMM_WORLD)失败
未能连接到引导队列-5064:344
如何使程序正常工作?
MPI_Barrier()
是一个集体操作,一旦被从通信器调用,它将完成所有MPI任务。
如果我正确地阅读了您的代码,那么任务0
不会调用MPI_Barrier(MPI_COMM_WORLD)
,所以您的程序将死锁,除非MPI库中的某种机制中止它
相关文章:
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- MPI突然停止了对多个核心的操作
- 设置 Visual Studio for MPI: 找不到标识符错误
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 重载 MPI 中的运算符 ()
- MPI:检查是否有任何进程已终止
- 使用 pybind11 共享 MPI 通信器
- 使用 CMake,Microsoft MPI 和 Visual Studio 2017 找不到 mpi.h
- 在具有 MPI 的超立方体中广播
- 通过 mpi 发送 c++ 标准::矢量<bool>
- 使用 MPI 的 C++ 中的并行 for 循环
- 如何将 OpenMP 和 MPI 导入到大型 CLion CMake 项目中?
- 如何通过Boost.MPI发送2d Boost.MultiArray的子阵列?
- HDF5 构建了并行支持,但找不到特定于 mpi 的功能
- MPI 集合通信中的指针分配
- 仅特定内核计数上的 MPI 内存损坏
- 如何在 Mac OS 上安装 boost-mpi 及其对 clang 的依赖关系?
- 从Visual Studio 2017运行MPI应用程序,每个进程在不同的cmd窗口中
- 在 MPI 中共享数组的一部分