我有一个数据结构,该数据结构是使用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
循环中完成此操作?我不确定。我对此没有任何经验。