c++ - MPI:为什么我在下一个例子中使用 MPI_Barrier 时出现错误?

标签 c++ parallel-processing mpi

我是 MPI 的新手,我想做一个问题,我有 2 个数组 A 和 B,有 15 个元素,我有 16 个进程,每个进程代表数组中的一个元素(我不使用进程零)。数组 A 在位置 8...15 中存储了输入数据,该位置代表树的叶子,在第一步中,我在数组中进行压缩,叶子将数字发送给父节点,父节点从所有节点接收数字儿子和添加数字并发送给父亲。数组 A si 在过程 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]=%d\n", id, A[id]);
    B[id] = A[id];
    printf("B[%d]=%d\n", 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 %d\n", 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 %d\n", id, A[id], id / 2);
            MPI_Barrier(MPI_COMM_WORLD);
        }
        if (id % 2 == 1)
        {
            B[id] = B[(id - 1) / 2];
            printf("B[%d]=%d\n", id, B[id]);
        }
        else
        {
            B[id] = B[id / 2] - A[id + 1];
            printf("B[%d]=%d\n", id, B[id]);
        }
    }
    MPI_Finalize();
    free(A);
    return 0;

然后我收到下一个错误:

[15]fatal error
Fatal error in MPI_Barrier:Other MPI error, error stack:
MPI_Barrier(MPI_COMM_WORLD) failed
failed to attach to a bootstrap queue - 5064:344

我该怎么做才能使程序运行?

最佳答案

MPI_Barrier() 是一个集体操作,一旦被来自通信器的所有 MPI 任务调用就会完成。

如果我正确阅读了您的代码,任务 0 不会调用 MPI_Barrier(MPI_COMM_WORLD),因此您的程序将死锁,除非 MPI 库中的某种机制中止它。

关于c++ - MPI:为什么我在下一个例子中使用 MPI_Barrier 时出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47104350/

相关文章:

hudson - Jenkins CI (Hudson) - 如何启动交互式下游作业?

c - mpicc-vt : command not found

c++ - 使用数组

c++ - 根据类模板参数淘汰类模板构造函数

c++ - 在 C++ 中比较字符时是否需要遵循特殊语法?

bash - 使用管道代替时对 Sed 性能的影响;

erlang - 构建 Erlang 服务器场(用于业余爱好项目)最便宜的方法是什么?

c - MPI_Bcast : Efficiency advantages?

java - MPI 应用程序在使用大量库的集群配置中卡住

c++ - 函数 "atomic_add_32_nv"必须有一个原型(prototype)