2014-06-20 26 views
2

我看到下面的警告信息配置MPICH(一種流行的MPI實現)時使用GNU(4.8)一個GNU/Linux的x86_64的系統上編譯器:避免假定包含浮點類型的結構的擴展數據塊?

檢查最大的C結構浮點對齊長 雙打... 16個

配置:警告:包含長雙打的結構可能與 對齊,與帶浮點或長整型的結構不同。 MPICH不會自動處理此案例,您應該避免假定包含浮點類型的結構 的範圍。

你可以給一個(C語言)的例子,說明我應該避免什麼?

(指向相關的文件也表示讚賞。)

回答

3

的MPICH配置腳本正在檢查的編譯器如何對齊的結構體的成員,和結構本身。

struct { char a; float b; } char_float; 
struct { float b; char a; } float_char; 
struct { char a; double b; } char_double; 
struct { double b; char a; } double_char; 

所有這四個可能有不同的對齊或填充。我想你已經知道這一點,但它的覆蓋更好的細節,在這個問題:Structure padding and packing

你的問題你應該避免什麼:

struct { char a; long double b; } char_long_double; 
struct { long double b; char a; } long_double_char; 
struct { long double a; int b; char c; } long_double_int_char; 

這是一個「長雙」結構。配置腳本檢測到編譯器處理這些結構的方式與編譯器處理包含'float'或'double'類型的結構的方式不同。如果您希望使用MPICH的MPI_Type_create_struct來描述「長雙」類型的東西,它可能會提供意想不到的行爲。

當這個代碼寫在大約8年前,很長時間雙打很少被使用,當他們是,他們表現得像雙打。如果你正在使用長雙打,發一張紙條 - 或者更好的測試用例! - [email protected]和MPICH傢伙將調查是否仍然是一個問題。