c - 使用 2D 矩阵的 MPI_Sendrecv 问题

标签 c mpi

据我所知,MPI_Sendrecv 需要两个不同的缓冲区用于发送和接收。我的以下代码将 (N/P) 行 block 发送到 P-1 处理器,但它不起作用并给我一个卡住的屏幕。我试图确保一切正确,但我不知道问题出在哪里(我省略了变量声明以使其简短)

int **M, **FinalM, **M0;
M = malloc(N * sizeof (int *));
for (i = 0; i < N; i++) {
    M[i] = malloc(N * sizeof (int));
}
FinalM = malloc(N * sizeof (int *));
for (i = 0; i < N; i++) {
    FinalM[i] = malloc(n * sizeof (int));
}

M0 = malloc(N/P * sizeof (int *));
for (i = 0; i < N/P; i++) {
    M0[i] = malloc(N * sizeof (int));
}

c = N/P; // P is Number of Processors and N rows
if (rank == 0) {
    for (i = 0; i < P; i++) {
        k = i*c;
        k1 = (i + 1) * c;
        for (j = k; j < k1; j++) {
            MPI_Sendrecv(M[j], N, MPI_INT, i, TAG, FinalM[j], N, MPI_INT, i, TAG, MPI_COMM_WORLD, &status[d]);
        }
    }
} else {

    for (i = 0; i < (N / P); i++) {
        MPI_Recv(M0[i], N, MPI_INT, 0, TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    }
}

请问有人可以给我一个解决这个问题的提示吗? 谢谢。

最佳答案

来自 https://www.open-mpi.org/doc/v1.8/man3/MPI_Sendrecv.3.php#toc7 的文档:

MPI_Sendrecv executes a blocking send and receive operation.

在您的情况下,主循环将矩阵的一部分发送到第一个工作程序并阻塞,等待工作程序响应。没有响应,因此它永远挂起。您需要在主循环中仅使用 MPI_Send,然后再使用 MPI_Recv 循环。工作人员必须使用 MPI_Send 发回一些内容。

关于c - 使用 2D 矩阵的 MPI_Sendrecv 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33503503/

相关文章:

c - 分配第二个数组时出现段错误

c++ - Boost MPI 和序列化 - 序列化对象的大小

mpi - 是MPI_Reduce阻止(或自然屏障)吗?

parallel-processing - 并行计算的典型示例是什么?

c - MPI_Scatter and Gather - 二维数组,不均匀 block

使用邻接矩阵创建图

c - 强化 : Path Manipulation in C - White List Implementation doesn't work - fopen issue

c# - 在循环中使用方法 Marshal.PtrToStructure 时出现访问冲突异常

c - getchar 以错误的顺序给出输出

c - 如何使用 makefile 创建两个具有不同 -D 变量 = 值的 C 可执行文件