MPI Bcast avec erreur de segmentation MPI_Type_create_struct

Je m’oblige à faire une émission avec une structure personnelle en MPI en langage C. En gros, j’ai créé la struct Vector3d.

typedef struct { double x, y, z; } Vector3d; 

Ensuite, j’ai lu et codé ceci pour chaque processus MPI.

 int rank, size; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); // MPI Struct para Vector3d int nroItems = 3; int blockLengths[3] = { 1, 1, 1 }; MPI_Datatype types[3] = { MPI_DOUBLE, MPI_DOUBLE, MPI_DOUBLE }; MPI_Datatype MPI_Vector3d; MPI_Aint offsets[3]; offsets[0] = offsetof(Vector3d, x); offsets[1] = offsetof(Vector3d, y); offsets[3] = offsetof(Vector3d, z); MPI_Type_create_struct(nroItems, blockLengths, offsets, types, &MPI_Vector3d); MPI_Type_commit(&MPI_Vector3d); 

Ensuite, je diffuse un tableau de Vector3d avec cela.

 Vector3d * num = (Vector3d *) malloc(sizeof(Vector3d) * 10); if(rank == 0) { ... ... MPI_Bcast(num, 10, MPI_Vector3d, 0, MPI_COMM_WORLD); } else { MPI_Bcast(num, 10, MPI_Vector3d, 0, MPI_COMM_WORLD); } 

Et j’ai ça quand je le lance.

 [mario-elementary:24020] *** Process received signal *** [mario-elementary:24020] Signal: Segmentation fault (11) [mario-elementary:24020] Signal code: Address not mapped (1) [mario-elementary:24020] Failing at address: 0x56fae13e2cc8 [mario-elementary:24020] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0xfcb0) [0x2b7d6fce7cb0] [mario-elementary:24020] [ 1] /lib/x86_64-linux-gnu/libc.so.6(+0x14ae90) [0x2b7d70040e90] [mario-elementary:24020] [ 2] /usr/lib/libmpi.so.0(+0x3f812) [0x2b7d6fa67812] ... ...etc -------------------------------------------------------------------------- mpirun noticed that process rank 0 with PID 24020 on node mario-elementary exited on signal 11 (Segmentation fault). -------------------------------------------------------------------------- 

S’il vous plaît aider!

Il y a une faute de frappe dans vos offsets

 offsets[3] = offsetof(Vector3d, z); 

Devrait être offset[2] place. Je suppose que tout ce qu’il faut, c’est résoudre le problème du bcast.

Aussi, quel est le résultat de votre fonction offsetof? Comment ça marche?