我正在使用MPI(MPICH)进行矩阵乘法,给每个处理器一个矩阵A和矩阵B的片段。然后,我可以对那些片段进行矩阵乘法,但是我需要其他输入对于剩下的行。因此,处理器必须彼此通信以将它们的B矩阵块相互发送。由于矩阵乘法的性质,我只需要旋转矩阵B的切片,而A的相同切片可以保留在最初给出的块的处理器中。
我正在努力解决的问题是如何在MPI_Sendrecv调用中旋转源/目标的变量。我似乎无法让他们直截了当。基本上,我有两个变量rank_next
& rank_prev
设置MPI调用的源和目标。但是,让这些变量正确配置已成为我的挑战。一旦我到达num_procs - 1
(处理器数量 - 1),我需要循环回到0.我似乎无法得到这个逻辑,我已经盯着它看了一会儿。
rank
是0 - num_procs - 1
int rank_next = rank + 1;
int rank_prev = rank - 1;
if(rank_prev <= 0){
rank_prev = num_procs - 1;
}
if(rank_next >= num_procs){
rank_next = 0;
}
printf("%i rank - %i rank_next - %i rank_prev\n", rank, rank_next, rank_prev);
for (int p = 0; p < num_procs; p++) {
printf("STATUS: multiplying slice B - %i\n", p);
//perform multiplication for each processor
for (int i = 0; i < row; i++) {
for (int j = 0; j < subCol; j++) {
for (int k = 0; k < col; k++)
//matrix multiply func
}
}
}
//rotate B
MPI_Status status;
printf("%i sending subB to %i\n", rank, rank_next);
MPI_Sendrecv(&subB, row * subCol, MPI_INT, rank_next, 0, &subB, row * subCol, MPI_INT, rank_prev, 0, MPI_COMM_WORLD, &status);
rank_next++;
rank_prev++;
if(rank_next >= num_procs){
rank_next = 0;
}
if(rank_prev >= num_procs){
rank_prev = 0;
}
}
我也不是一个优秀的C程序员,因此代码质量可能不是很干净。