2015-11-28 45 views
0

我工作的MPI對C.我有我想要序列,並使用MPI集體通信發送到其他節點這個自定義結構(收集,分散,廣播)發送一個結構使用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個雙打數組。你應該讓你的編譯器「打包」你的結構(例如GCC或Clang中的__attribute__((__packed__))),以便它沒有填充。

+2

您不必這樣做,打包結構可能會有負面的性能影響其他地方在所有雙打的情況下可能無關緊要,但這是一般糟糕的建議。 – Jeff

+2

MPI是關於使用它的程序的可移植性。我第二個傑夫。 –

+0

@Jeff:只包含雙打的包裝結構將不會產生負面的表現效果。這應該是顯而易見的,因爲雙精度結構在佈局方面與雙精度數組相同。包裝的東西是皮帶和吊帶,實際上在大多數系統中都不需要,如果你仍然覺得它有點痛。您可以將包裝關閉並添加編譯時斷言,即兩個結構數組的大小與20個雙倍大小相同。 –