2013-12-25 3 views
2

Я заставляю себя делать трансляцию с личной структурой на CI-языке MPI. В основном я создал структуру Vector3d.MPI Bcast с ошибкой сегментации MPI_Type_create_struct

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

Затем я читал и кодировал это для каждого процесса 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); 

Затем я делаю трансляцию массива Vector3d с этим.

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

И у меня это есть, когда я запускаю его.

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

Помогите!

+1

В вызове MPI_Bcast в части else вы указываете значение root как 0, не должно ли оно быть ненулевым рангом? – Ketan

ответ

1

Существует опечатка в ваших смещений

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

Должно быть offset[2] вместо этого. Я предполагаю, что и исправление проблемы bcast - это все, что требуется.

Также, что является результатом вашей функции offsetof? Как это работает?

+0

Да! Была ошибка сега ... Спасибо! –

Смежные вопросы