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