Использование MPI_Type_struct и MPI_Bcast для передачи структуры данных в C - PullRequest
0 голосов
/ 15 мая 2019

У меня есть структура данных, которую я строю последовательно, то есть на rank = 0 с использованием MPI:

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.Сначала я создал MPI_Datatype, чтобы иметь возможность перейти на MPI_Bcast.Затем я использовал MPI_Address, чтобы определить массив MPI_Aint, который мне нужен для создания MPI_Type_struct для моего node struct.

Моя текущая реализация содержит ошибки, то есть данныене сообщается всем процессам:

    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?Я не уверен.У меня нет опыта работы с этим.

...