mpi矩阵乘法以使用不同数量的处理器运行

问题描述 投票:0回答:1

所以我得到了在1个进程上运行时适用的代码。虽然当我尝试在2个或更多处理器上运行它时(mpirun -n 4)(mpirun -n 8)等;我的一半结果返回为零。我假设是因为它不能处理矩阵大小可整除处理器数量的情况。有任何想法吗?我正在尝试从命令行初始化两个矩阵,并使用MPI执行矩阵乘法。我知道这一点,很乐意提供帮助。例如,当我输入2的大小并将矩阵A初始化为值{1,4,6,7}并将矩阵B初始化为{8,9,4,5}时,我的结果就是{8,9, 0,0} ..]]

void init_Matrix(int n, int matrix[n][n])
{

  for(int i = 0; i < n; i++)
  {
    for(int j = 0; j < n; j++)
    {
      scanf("%i", &matrix[i][j]);
    }
  }
}


void printMatrix(int n, int matrix[n][n])
{
  for(int i = 0; i < n; i++)
  {
    for(int j = 0; j < n; j++)
    {
      printf("%d" , matrix[i][j]);
      printf(" ");
    }
    printf("\n");
  }
}

int main(int argc, char *argv[])
{
  MPI_Init(&argc, &argv);
  int rank, size;
  MPI_Comm_size(MPI_COMM_WORLD, &size); //num p
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  int n;
  if(rank == 0)
  {

    printf("Enter in size of matrix! \x0A");
    scanf("%i",&n);
  }

  MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);
  int A[n][n];
  int B[n][n];
  int C[n][n];
  int aa[n/size][n];
  int cc[n/size][n];
if(rank == 0)
{
    init_Matrix(n,A);
    init_Matrix(n,B);
}
for(int i = 0; i < n; i++)
{
  for(int j = 0; j < n; j++)
  {
    cc[i][j] = 0;
  }
}
  //scatter rows of first matrix to different processes
  MPI_Scatter(A, n*n/size, MPI_INT, aa, n*n/size, MPI_INT,0,MPI_COMM_WORLD);
  //broadcast second matrix to all processes
  MPI_Bcast(B, n*n, MPI_INT, 0, MPI_COMM_WORLD);

  MPI_Barrier(MPI_COMM_WORLD);
  //perform vector multiplication by all processes
    for(int k = 0; k < n/size; k++)
    {
      for (int i = 0; i < n; i++)
      {
        for (int j = 0; j < n; j++)
        {
          cc[i][j] += A[i][k] * B[k][j];
        }
      }
    }

  MPI_Gather(cc, n*n/size, MPI_INT, C, n*n/size, MPI_INT, 0, MPI_COMM_WORLD);
  MPI_Barrier(MPI_COMM_WORLD);
  if(rank == 0){
    printMatrix(n, C);
  }
  MPI_Finalize();
}

所以我得到了在1个进程上运行时适用的代码。虽然当我尝试在2个或更多处理器上运行它时(mpirun -n 4)(mpirun -n 8)等;我的一半结果返回为零。Im...

c arrays algorithm mpi matrix-multiplication
1个回答
0
投票

您有一些逻辑问题。

© www.soinside.com 2019 - 2024. All rights reserved.