用于矩阵乘法的MPI切片逻辑

时间:2016-10-30 17:15:35

标签: c mpi matrix-multiplication

我正在使用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程序员,因此代码质量可能不是很干净。

0 个答案:

没有答案