【问题标题】:Garbage values on extracting values from an array while using MPI使用 MPI 时从数组中提取值的垃圾值
【发布时间】:2017-11-12 08:24:46
【问题描述】:

我正在尝试使用 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

请帮忙

【问题讨论】:

  • num 在使用前未初始化。始终使用 -Wall 编译,即带有所有警告。
  • num 未声明,这不是minimal reproducible example,请更新代码。另外:在实践中 - 使用MPI_Scatter
  • 同样mat_a在rank0中声明的范围受条件限制。
  • @DmitriChubarov 哦,是的。我真傻。谢谢。

标签: c mpi hpc


【解决方案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);
        }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-14
    • 2013-05-07
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多