我正在使用MPI运行一个矩阵乘法程序。数组'a‘和'b’类型为double,大小为512*512。数组'a‘将被分散,数组'b’将被广播。矩阵乘法后的最终结果是收集在数组c512中的主进程中,我试图使用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);
}
}我是一个编程初学者,但我整晚都在努力想办法解决这个问题,但没有用。如果有人能帮我的忙我会很感激的。
发布于 2015-02-20 13:05:07
当你发送&a + j*blksize*N*sizeof(double)时,你没有做你想做的事情。首先,&a是a的地址,它是一个数组,不是要发送的,而是要发送指针或*a (从技术上讲,这是一个数组,但它将被隐式转换为指向所述数组的第一个元素的指针)。接下来,在执行指针算术时,您不需要(实际上也不应该)乘sizeof(type);编译器将为您处理这个问题。所以您的第一个MPI_Send命令应该是
MPI_Send(*a + j*blksz*N, blksz*N, MPI_DOUBLE, j, 0, MPI_COMM_WORLD);进行类似的更改(所有发送和接收),您的代码应该可以工作。
https://stackoverflow.com/questions/28629140
复制相似问题