使用MPI_Type_struct和MPI_Bcast在C语言中传递数据结构

时间:2019-05-14 22:52:18

标签: c struct parallel-processing mpi memory-address

我有一个数据结构,该数据结构是使用MPI在rank = 0上串联构建的:

typedef struct node {
  int nodeID,
  dof_u, dof_v, dof_theta ;
  double x, y ;
  char BC[8] ;
} node ;

然后我按照以下方式为4个“节点”的数组填充此结构:

  int n_node = 4 ;
  int n_dof = 3*n_node ;
  node *nodes = malloc(sizeof(node) * n_node) ;

  if (rank == 0) {
    nodes[0].nodeID = 0 ;
    nodes[0].dof_u = 0 ; nodes[0].dof_v = 1 ; nodes[0].dof_theta = 2 ;
    nodes[0].x = 0. ; nodes[0].y = 0. ;

    nodes[1].nodeID = 1 ;
    nodes[1].dof_u = 3 ; nodes[1].dof_v = 4 ; nodes[1].dof_theta = 5 ;
    nodes[1].x = 0. ; nodes[1].y = 12. * 12. ;

    nodes[2].nodeID = 2 ;
    nodes[2].dof_u = 6 ; nodes[2].dof_v = 7 ; nodes[2].dof_theta = 8 ;
    nodes[2].x = 9. * 12. ; nodes[2].y = 12. * 12. ;

    nodes[3].nodeID = 3 ;
    nodes[3].dof_u = 9 ; nodes[3].dof_v = 10 ; nodes[3].dof_theta = 11 ;
    nodes[3].x = 9. * 12. ; nodes[3].y = 0. ;

在添加任何MPI内容之前,这是连续进行的。当然,现在我正在使用MPI的问题是所有这些信息仅存在于proc 0,但是我想使用MPI_Bcast将其传达给所有proc。首先,我创建了一个MPI_Datatype以便能够传递给MPI_Bcast。然后,我使用MPI_Address来确定为MPI_Aint MPI_Type_struct创建node所需的struct数组。

我当前的实现存在错误,即未将数据传递给所有proc:

    for (int i = 0 ; i < n_node ; i++) {
      MPI_Datatype node ;
      MPI_Datatype type[7] = {MPI_INT, MPI_INT, MPI_INT, MPI_INT,
                              MPI_DOUBLE, MPI_DOUBLE, MPI_CHAR} ;
      int blocklen[7] = {1, 1, 1, 1, 1, 1, 8} ;
      MPI_Aint disp[7] ;

      MPI_Address(&nodes[i].nodeID, &disp[0]) ;
      MPI_Address(&nodes[i].dof_u, &disp[1]) ;
      MPI_Address(&nodes[i].dof_v, &disp[2]) ;
      MPI_Address(&nodes[i].dof_theta, &disp[3]) ;
      MPI_Address(&nodes[i].x, &disp[4]) ;
      MPI_Address(&nodes[i].y, &disp[5]) ;
      MPI_Address(&nodes[i].BC, &disp[6]) ;

      disp[6] = disp[6] - disp[0] ;
      disp[5] = disp[5] - disp[0] ;
      disp[4] = disp[4] - disp[0] ;
      disp[5] = disp[3] - disp[0] ;
      disp[2] = disp[2] - disp[0] ;
      disp[1] = disp[1] - disp[0] ;
      disp[0] = 0 ;

      MPI_Type_struct(7, blocklen, disp, type, &node) ;
      MPI_Type_commit(&node) ;

      MPI_Bcast(&nodes[i], 1, node, 0, MPI_COMM_WORLD) ;

      MPI_Type_free(&node) ;
    }

有人在我这里所做的事情有明显的错误吗?也许我是错误地计算了相对偏移量,还是无法在for循环中完成此操作?我不确定。我对此没有任何经验。

0 个答案:

没有答案