使用MPI

时间:2017-11-12 08:24:47

标签: c mpi hpc

我正在尝试使用MPI进行矩阵矩阵乘法。我现在正在使用一种非常硬编码的方法。我已经在处理器排名为0的位置初始化了一个数组。我将这个数组发送给所有其他处理器,即排名为1和排名为2的处理器。

现在,当我尝试在临时数组中提取一些信息时,我得到了一些垃圾值。我无法弄清楚原因。

以下是代码:

MPI_Init(&argc,&argv);
  MPI_Comm_size(MPI_COMM_WORLD,&world_size);;
  MPI_Comm_rank(MPI_COMM_WORLD,&rank);

  if(rank == 0){
        int mat_a[9] = {1,1,1,2,2,2,3,3,3};
        int mat_b[9] = {1,1,1,2,2,2,3,3,3};
        for(i = 1;i<world_size;i++){
                MPI_Send(&mat_a[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
                //MPI_Send(&mat_b[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
        }
  }



  if(rank!=0){
        MPI_Recv(&mat_a[0],9,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
        //MPI_Recv(&mat_b[0],9,MPI_INT,0,tag,MPI_COMM_WORLD,&status);
  }

  for(i = rank;i<9;i=i+3){
        temp_1[num] = mat_a[i];
        num++;
  }
  num = 0;
/*  for(i = rank;i<9;i=i*3){
        temp_2[num] = mat_b[i];
        num++;
  }
  num = 0;
 */
  for(i = 0;i<3;i++){
        printf("in rank %d with val at temp_1 = %d\n",rank,temp_1[i]);
  }

这是我的输出:

in rank 0 with val at temp_1 = 550149432
in rank 0 with val at temp_1 = 0
in rank 0 with val at temp_1 = 4965952
in rank 1 with val at temp_1 = 1
in rank 1 with val at temp_1 = 2
in rank 2 with val at temp_1 = 1
in rank 2 with val at temp_1 = 2
in rank 2 with val at temp_1 = 3
in rank 1 with val at temp_1 = 3
Job complete

请帮忙

1 个答案:

答案 0 :(得分:1)

在等级0上,初始化mat_a的范围仅限于条件

  if(rank == 0){
        int mat_a[9] = {1,1,1,2,2,2,3,3,3};
        int mat_b[9] = {1,1,1,2,2,2,3,3,3};
        for(i = 1;i<world_size;i++){
                MPI_Send(&mat_a[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
                //MPI_Send(&mat_b[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
        }
  }

在此范围之外,声明变量mat_a未初始化。

这就是为什么输出对于排名为正且具有rank=0的流程不正确的流程是正确的。

不幸的是,GCC不会承认这个错误。即使很明显在没有初始化的情况下使用变量。

您可以在following link找到重现此错误的完整示例。

要通过最少的更改来解决此问题,您可以按照以下步骤进行修复:

  if(rank == 0){
        int tmp_a[9] = {1,1,1,2,2,2,3,3,3};
        int tmp_b[9] = {1,1,1,2,2,2,3,3,3};
        for(i=0;i<9;i++) {
                mat_a[i] = tmp_a[i];
                mat_b[i] = tmp_b[i];
        }
        for(i = 1;i<world_size;i++){
                MPI_Send(&mat_a[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
                //MPI_Send(&mat_b[0],9,MPI_INT,i,tag,MPI_COMM_WORLD);
        }
  }