2016-03-30 25 views
4

我有一個關於MPI_Aint的簡單問題,但我沒有在任何地方找到任何答案。出於某種原因,至少在OpenMPI 1.8.4和1.10.1中,MPI_Type_size(MPI_Aint)不起作用(它看起來不像傳統數據類型,例如MPI_DoubleMPI_Int),但我不認爲這是OpenMPI問題。MPI_Aint的大小?

我必須創建一個類型MPI_Type_create_hindexed()並動態分配array_of_displacements數組。計算大小N後,我寫了

MPI_Aint* disps = (MPI_Aint*) malloc(N*sizeof(MPI_Aint)) ; 

,而不是

int mpiAintSize ; 
MPI_Type_size(MPI_Aint, &mpiAintSize) ; 
MPI_Aint* disps = (MPI_Aint*) malloc(N*mpiAintSize) ; 

因爲這個問題。只要我很幸運,sizeof()就可以完成這項工作,而且我不需要可移植性(此數組將用於使用MPI-I/O寫/讀大文件)。

但我想知道:什麼是清潔和便攜的方式來分配我的disps陣列?我錯過了什麼關於MPI_Aint?

+0

編輯:對於任何感興趣的人,我在Gilles的答覆中發現,不存在MPI_Aint是C類型的可移植性問題。我們從不讀/寫'MPI_Aint',我們只用它們的值來定義結構(不依賴於它們在內存中的大小)。因此不需要爲它們創建一個統一的(便攜式)'MPI_Type'。 –

回答

2

MPI_Aint不是MPI_TypeMPI_INTMPI_DOUBLE或者你有MPI_Type_create_hindexed()創建,MPI_Aint是在C語言中的類型,像intdoublestruct。事實上,我懷疑大多數時候MPI_Aint將被簡單地定義爲足夠大的typedef來存儲它需要的內容。最有可能的是,它將被定義爲typedef long MPI_Aint;typedef long long MPI_Aint;

因此,您使用sizeof()而不是MPI_Type_size()來分配陣列的方法是正確的。

+1

事實上,檢查後,我發現我的mpi.h中的typedef,它來作爲一個ptrdiff_t ...恕我直言,它是相當混亂,讓MPI_Double看起來像MPI_Aint,而一個是MPI_type而不是另一個。但無論如何,非常感謝您的回答! –

+0

@RobinHuart如果我理解正確並且更加混淆,甚至有一個MPI_AINT數據類型描述了一個MPI_Aint。 https://trac.mpich.org/projects/mpich/browser/src/include/mpi.h.in?rev=fd6627a1bf6cdbe629defe77db231558948c48dd – alfC