使用数组的C语言中的MPI-使用MPI_Send()和MPI_Recv()实现MPI_Scatter()

使用数组的C语言中的MPI-使用MPI_Send()和MPI_Recv()实现MPI_Scatter(),c,arrays,parallel-processing,mpi,C,Arrays,Parallel Processing,Mpi,我正在尝试使用MPI运行一个矩阵乘法程序。数组“a”和“b”的类型为double,大小为512*512。阵列“a”将分散,阵列“b”将广播。矩阵相乘后的最终结果将在主进程中收集到数组c[512][512] 我试图使用MPI_Send()和MPI_Recv()函数实现MPI_Scatter(),但我有点陷入了无限循环(可能)P是进程数 double a[512][512], b[512][512], c[512][512]; blksz = 512/P; if(rank == 0) { /

我正在尝试使用MPI运行一个矩阵乘法程序。数组“a”和“b”的类型为double,大小为512*512。阵列“a”将分散,阵列“b”将广播。矩阵相乘后的最终结果将在主进程中收集到数组c[512][512] 我试图使用MPI_Send()和MPI_Recv()函数实现MPI_Scatter(),但我有点陷入了无限循环(可能)P是进程数

double a[512][512], b[512][512], c[512][512];
blksz = 512/P;
if(rank == 0) {
    // Scatter input matrix a, implementation of MPI_Scatter()
    for(j = 1 ; j < P ; j++ ) {
        MPI_Send(&a + j*blksz*N*sizeof(double), blksz*N, MPI_DOUBLE, j, 0, MPI_COMM_WORLD);
    }

    // Broadcast the input matrix b, implementation of MPI_Bcast()
    for(j = 1 ; j < P ; j++ ) {
        MPI_Send(&b, N*N, MPI_DOUBLE, j, 1, MPI_COMM_WORLD);
    }
}
else {
    MPI_Recv(&a, blksz*N, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status);
    MPI_Recv(&b, N*N, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &status);
}

for(i = 0 ; i < blksz; i++) {
    for(j = 0 ; j < N ; j++) {
        c[i][j] = 0;
        for(k = 0 ; k < N ; k++) {
            c[i][j] += a[i][k] * b[k][j];
        }
    }
}

// Gather result, implementation of MPI_Gather()
if(rank != 0) {
    MPI_Send(&c, blksz*N, MPI_DOUBLE, 0, 2, MPI_COMM_WORLD);
}
else {
    for(i = 1 ; i < P ; i++) {
        MPI_Recv(&c+i*blksz*N*sizeof(double), blksz*N, MPI_DOUBLE, 0, 2, MPI_COMM_WORLD, &status);
    }
}
双a[512][512],b[512][512],c[512][512];
blksz=512/P;
如果(秩==0){
//分散输入矩阵a,MPI_分散()的实现
对于(j=1;j

我是一个编程新手,但我彻夜未眠,试图找出答案,但没有结果。如果有人能帮我,我会非常感激的

当您发送
&a+j*blksize*N*sizeof(double)
时,您没有做您想做的事情。首先,
&a
a
的地址,这是一个数组数组,它不是您想要发送的,您想要发送一个指针,或者
*a
(从技术上讲,这是一个数组,但它将隐式转换为指向所述数组的第一个元素的指针)。接下来,在执行指针算术时,您不需要(实际上也不应该)乘以
sizeof(type)
;这将由编译器为您处理。因此,您的第一个
MPI\u Send
命令应该是

MPI_Send(*a + j*blksz*N, blksz*N, MPI_DOUBLE, j, 0, MPI_COMM_WORLD);

进行类似的更改(对于所有发送和接收),您的代码应该可以工作。

感谢您的反馈。我试过你说的话,但我还是被卡住了。