2010-05-02 79 views
5

我不得不承認,看到需要多少行代碼才能將一個C結構與MPI進行傳輸,我感到非常震驚。MPI和C結構

在什麼情況下它可以使用預定義的數據類型MPI_CHAR簡單地傳輸結構?考慮下面的例子:

struct particle { 
    double x; 
    double y; 
    long i; 
}; 

struct particle p; 
MPI_Isend(&p, sizeof(particle), MPI_CHAR, tag, MPI_COMM_WORLD, &sendr); 

就我而言,所有的進程運行在同一個體系結構上。填補唯一的問題?

+1

我想借此機會說出MPI是否不是一個嚴格的要求,請使用Google的協議緩衝區。 http://code.google.com/apis/protocolbuffers/ – Stephen 2010-05-02 16:53:39

+0

你不應該擔心填充,sizeof報告正確的值包括填充 – Anycorn 2010-05-02 17:06:36

+1

是的,但它可能會有所不同,這取決於架構... – hanno 2010-05-03 17:34:12

回答

8

MPI_BYTE是發送無類型數據時使用的數據類型,而不是MPI_CHAR。如果兩臺機器具有相同的架構,但使用不同的字符編碼,則使用MPI_CHAR可能會損壞您的數據。將數據發送爲MPI_BYTE將使二進制表示保持原樣並不進行任何表示轉換。

這就是說,是的,從技術上講,如果(並且只有)可以保證發送和接收端的數據表示形式相同,那麼發送結構是正確的。然而,這是糟糕的編程習慣,因爲它混淆了代碼的目的,並引入了平臺依賴性。

請記住,您只需定義一次數據類型並提交一次數據類型,而通常需要編寫代碼來發送數次。減少所有發送的清晰度只是爲了在單個定義上保存幾行文件而不是交易。

+0

謝謝。還有一個問題:使用'MPI_BYTE'有什麼好處?或者,當我使用自己的MPI數據類型傳輸一個結構體時,是否有任何開銷?我正在考慮像MPI這樣的將數據複製到另一個緩衝區的小塊等等...... – hanno 2010-05-04 14:11:27

+0

這可能是實現相關的,我會想象,不執行表示檢查/轉換會得到的性能增益是大規模的首先傳遞信息的總體成本蒙上了陰影。儘管如此,比較一下發送大型有效載荷(數千)結構體類型與無類型結構需要多長時間,這可能是一個有趣的實驗。 – suszterpatt 2010-05-07 09:12:39

3

就個人而言,我會比填充更關心可理解性和可維護性,甚至可移植性。如果我發送一個結構,我喜歡我的代碼,以顯示我正在發送一個結構,而不是一串字節或字符。我希望我的代碼可以在多種語言標準和編譯器的多代架構上運行。

我想我所說的是,如果值得定義一個結構(而且你顯然認爲是這樣),那麼值得定義一個結構。保存幾行(近似)樣板文件並不是一個反對的論點。

+1

我不明白的論據關於可維護性。在上面的代碼段中,我可以更改結構而無需執行其他任何操作。然而,如果我使用'MPI_Type_create_struct'這種方法來做到這一點,我必須改變至少4行代碼...... – hanno 2010-05-02 16:48:40

+0

@hanno,請參閱@ suszterpatt關於可維護性的論點的答案,比我管理的更好解釋。 – 2010-05-04 12:51:03