2

I'm forcing myself to do a broadcast with a personal struct in C-language MPI. Basically I've created the struct Vector3d.

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

Then i've been reading and code this for each MPI Process.

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);

Then i do the broadcast of an array of Vector3d with this.

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);
}

And i've got this when i run it.

[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).
--------------------------------------------------------------------------

Please help!

1
  • 1
    In the MPI_Bcast call in the else part, you mention root value as 0, shouldn't that be a nonzero rank? Commented Dec 25, 2013 at 21:25

1 Answer 1

1

There is a typo in your offsets

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

Should be offset[2] instead. I guess that and fixing the bcast problem is all it takes.

Also what is the result of your offsetof function? How does it work?

Sign up to request clarification or add additional context in comments.

1 Comment

Yep! There was the seg fault... Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.