使用数组的C语言中的MPI-使用MPI_Send()和MPI_Recv()实现MPI_Scatter()
我正在尝试使用MPI运行一个矩阵乘法程序。数组“a”和“b”的类型为double,大小为512*512。阵列“a”将分散,阵列“b”将广播。矩阵相乘后的最终结果将在主进程中收集到数组c[512][512] 我试图使用MPI_Send()和MPI_Recv()函数实现MPI_Scatter(),但我有点陷入了无限循环(可能)P是进程数使用数组的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) { /
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);
进行类似的更改(对于所有发送和接收),您的代码应该可以工作。感谢您的反馈。我试过你说的话,但我还是被卡住了。