2015-11-28 2 views
0

Я работаю над MPI на C. У меня есть эта пользовательская структура, которая я хочу сериализацию и отправить к другим узлам с использованием MPI коллективной коммуникации (Gather, Scatter, Broadcast)Отправка STRUCT с использованием MPI коллективной коммуникации

структура заключается в следующем

typedef struct { 
double x[2];  /* Old and new X-axis coordinates */ 
double y[2];  /* Old and new Y-axis coordinates */ 
double xf;   /* force along X-axis */ 
double yf;   /* force along Y-axis */ 
double xv;   /* velocity along X-axis */ 
double yv;   /* velocity along Y-axis */ 
double mass;  /* Mass of the body */ 
double radius;  /* width (derived from mass) */ 
} bodyType; 

Я пытался понять сериализации пользовательских структур на MPI, но не мог понять процесс. Если кто-то может помочь мне здесь было бы здорово

Спасибо

+0

'MPI_Type_struct' ваш друг! – simpel01

+2

@ simpel01, 'MPI_Type_struct' устарел в MPI-2 и больше не существует в MPI-3. Вместо этого следует использовать 'MPI_Type_create_struct'. –

+0

anyhelp о том, как их использовать? –

ответ

0

Хорошо, так что я был в состоянии пройти через документы и написал

const int nitems=8; 
    int blocklengths[8] = {2,2,1,1,1,1,1,1}; 
    MPI_Datatype types[8] = {MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE,MPI_DOUBLE}; 
    MPI_Datatype mpi_body_type; 
    MPI_Aint  offsets[8]; 
    offsets[0] = offsetof(bodyType, x); 
    offsets[1] = offsetof(bodyType, y); 
    offsets[2] = offsetof(bodyType, xf); 
    offsets[3] = offsetof(bodyType, yf); 
    offsets[4] = offsetof(bodyType, xv); 
    offsets[5] = offsetof(bodyType, yv); 
    offsets[6] = offsetof(bodyType, mass); 
    offsets[7] = offsetof(bodyType, radius); 
    MPI_Type_create_struct(nitems, blocklengths, offsets, types, &mpi_body_type); 
    MPI_Type_commit(&mpi_body_type); 
0

Ваша структура всего десять смежных двухместных номеров. Поэтому вам не нужно сообщать MPI о вашем типе, поэтому, поскольку его можно рассматривать как массив. Если у вас есть массив из семи ваших структур, просто сообщите MPI, что у вас есть массив из 70 двухместных. Вы должны сообщить своему компилятору «упаковать» вашу структуру (например, __attribute__((__packed__)) в GCC или Clang), чтобы у нее не было заполнения.

+2

Вам не нужно это делать, и упаковки структуры могут иметь отрицательную производительность эффекты в других местах. Это может не иметь значения в случае всех парных разрядов, но это плохой совет в целом. – Jeff

+2

MPI о переносимости используемых ею программ. Я второй Джефф. –

+0

@Jeff: Структуры упаковки, содержащие только удвоения, не будут иметь отрицательных эффектов. Это должно быть очевидно, потому что структура, полная удвоений, является макетом, такая же, как массив двойников. На упаковке вещи пояса и подтяжки, и на самом деле не потребуется в большинстве систем, если вы все еще чувствуете, как-то болит. Вы можете оставить упаковку и добавить утверждение времени компиляции, чтобы размер массива из двух структур был таким же, как размер 20 удвоений. –

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