散射 2D 矩阵 - MPI

Scatter a 2D matrix - MPI

提问人:Ian Nemo 提问时间:10/15/2023 最后编辑:Ian Nemo 更新时间:10/15/2023 访问量:49

问:

我现在正在学习并试图理解 MPI。

例如,我有一个矩阵 n*n(n = 4):

0 1 2 3 
4 5 6 7 
8 9 10 11 
12 13 14 15

我想分散这个矩阵,并创建四个新矩阵(我有四个过程):

排名 0:

0 1
4 5

排名 1:

2 3
6 7

排名 2:

8 9
12 13

排名 3:

10 11
14 15

我尝试这样做,但只有排名 0 才能获得正确的结果。

下面是我实现的代码:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <mpi.h>



int main(int argc, char *argv[]){

  int rank;
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);


  int n;
  if(rank == 0){
    scanf("%d", &n);
  }

  MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);


  MPI_Barrier(MPI_COMM_WORLD);


  int **matrix = (int **)malloc(n * sizeof(int *));
  int *matrix_1D = (int *)malloc(n * n * sizeof(int));


  for(int i = 0; i < n; i++){
    matrix[i] = (int *)malloc(n * sizeof(int));
  }

  if(rank == 0){
    // Reading the matrix
    for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++){
        scanf(" %d", &matrix[i][j]);
        matrix_1D[i*n + j] = matrix[i][j];
      }
    printf("\n");

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



  int new_n = n / 2; // Size of each smaller square matrix block

  MPI_Datatype block_type;
  int sizes[2]    ={n, n};          // Dimensions of the full matrix
  int subsizes[2] ={new_n, new_n};  // Dimensions of the smaller block
  int starts[2]   ={0, 0};          // Starting coordinates

  MPI_Type_create_subarray(2, sizes, subsizes, starts, MPI_ORDER_C, MPI_INT, &block_type);
  MPI_Type_commit(&block_type);


  int *local_matrix = (int *)malloc(new_n * new_n * sizeof(int)); // Each process will hold a block of the matrix

  MPI_Scatter(matrix_1D, 1, block_type, local_matrix, new_n*new_n, MPI_INT, 0, MPI_COMM_WORLD);

  printf("Rank %d received data:\n", rank);
  for(int i = 0; i < new_n; i++){
    for(int j = 0; j < new_n; j++){
      printf("%d ", local_matrix[i*new_n + j]);
    }
    printf("\n");
  } printf("\n");

  free(local_matrix);
  MPI_Type_free(&block_type);

  MPI_Finalize();
}

我理解错了什么?

我试图找到模式,但唯一不变的是排名 0 总是得到正确的结果,而所有其他排名都失败了。

我也尝试了这种分散方式:

  MPI_Scatter(matrix_1D, 1, block_type, local_matrix, 1, block_type, 0, MPI_COMM_WORLD);

但它没有用

C MPI MPICH MPI-IO mpic++

评论

0赞 9769953 10/15/2023
你是如何编译和运行你的程序的?
0赞 Gilles Gouaillardet 10/15/2023
首先,您需要在连续内存中分配 2D 矩阵。在这种情况下,要发送的第一个子矩阵的位移不是秩数的线性函数,因此不是拟合。相反,用于在发送方和接收方上定义 2x2 子矩阵,并在手动计算位移后使用。MPI_Scatter()MPI_Type_create_subarray()MPI_Scatterv()

答: 暂无答案