我看到下面的警告信息配置MPICH(一種流行的MPI實現)時使用GNU(4.8)一個GNU/Linux的x86_64的系統上編譯器:避免假定包含浮點類型的結構的擴展數據塊?
檢查最大的C結構浮點對齊長 雙打... 16個
配置:警告:包含長雙打的結構可能與 對齊,與帶浮點或長整型的結構不同。 MPICH不會自動處理此案例,您應該避免假定包含浮點類型的結構 的範圍。
你可以給一個(C語言)的例子,說明我應該避免什麼?
(指向相關的文件也表示讚賞。)
我看到下面的警告信息配置MPICH(一種流行的MPI實現)時使用GNU(4.8)一個GNU/Linux的x86_64的系統上編譯器:避免假定包含浮點類型的結構的擴展數據塊?
檢查最大的C結構浮點對齊長 雙打... 16個
配置:警告:包含長雙打的結構可能與 對齊,與帶浮點或長整型的結構不同。 MPICH不會自動處理此案例,您應該避免假定包含浮點類型的結構 的範圍。
你可以給一個(C語言)的例子,說明我應該避免什麼?
(指向相關的文件也表示讚賞。)
的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傢伙將調查是否仍然是一個問題。