2017-06-12 48 views
-5

我正在爲mpi寫一個type_traits庫,但是當我將「float int」定義爲MPI_FLOAT_INT的類型時,我在聲明錯誤中獲得兩個或多個變量類型,那麼等效類型MPI_FLOAT_INT在c + +?什麼是C++等效類型如果MPI_FLOAT_INT

回答

1

唯一權威源,所述MPI standard,如(第5.9.4節MINLOCMAXLOCMPI_FLOAT_INT定義:

數據類型MPI_FLOAT_INT好像 def按以下順序說明進行操作。

type[0] = MPI_FLOAT 
type[1] = MPI_INT 
disp[0] = 0 
disp[1] = sizeof(float) 
block[0] = 1 
block[1] = 1 
MPI_TYPE_CREATE_STRUCT(2, block, disp, type, MPI_FLOAT_INT) 

類似的結論適用於MPI_LONG_INTMPI_DOUBLE_INT

這意味着,類型對應於struct { float a; int b; },但前提是,沒有填充空間被插入ab之間保證。在int是64位並且必須以8字節對齊的系統上可能不是這種情況。可能需要指示編譯器生成打包結構,例如,與海灣合作委員會:

#pragma pack(push, 1) 
struct float_int 
{ 
    float a; 
    int b; 
} 
#pragma pack(pop) 

注意MPI_FLOAT_INT意在MINLOCMAXLOC減少使用,以找出兩者的最小/最大float值和持有它的編號最低的級別。

2

按照documentation

MPI_FLOAT_INT
這是一對32位浮點數後跟一個32位整數的。

相當於std::pair<float, int>struct float_int{ float f; int i;};

您可以嘗試使用int32_t而不是intstatic_assert(sizeof(float) == 4);來嘗試使尺寸正確。

+0

這不是官方的MPI規範。 MPI不在int或float中指定字節數。 –

0

根據Linux man pageMPI_FLOAT_INT是被定義爲一個結構:

struct { float, int }