2013-04-18 40 views
0

我注意到一個奇怪的事情,MPI_Send和MPI_Recv緩衝區大小,我不明白。文檔說這些功能的count參數描述若干datatype類型的元素:MPI_Send/MPI_Recv:元素數量或緩衝區大小?

int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, 
      int tag, MPI_Comm comm); 

計數[輸入]數在發送緩衝區(非負整數)

int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, 
      int tag, MPI_Comm comm, MPI_Status *status); 
元件

count [in]接收緩衝區中元素的最大數量(整數)

假設我們有2個進程中,第一(根)進程分配的Ñ整數的數組,並與一些數據

int* temp = (int*) malloc(n * sizeof(int)); 
for (int i = 0; i < n; i++) temp[i] = ...; 

然後將其發送到與秩= 1中的第二處理填充。

MPI_Send(temp, n, MPI_INT, 1, 0, MPI_COMM_WORLD); 

第二處理接收該陣列的ñ整數。

MPI_Recv(temp, n, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_INGNORE); 

但是在MPI_Recv之後,temp數組顯示被截斷。當我從n更改count參數到n * sizeof(int)時,我收到了一個正確的數組。但n * sizeof(int)描述緩衝區大小以字節爲單位,而不是像文檔所述的元素。這是一種常見的行爲還是一個簡單的誤解?附:我用MPICH2 x86架構MPI實現和32位VS08在Windows 7

+1

您正在正確閱讀文檔,並且發佈的Send/Recv行沒有問題,這表明其他地方存在問題。兩個任務中的temp和n是否都正確定義? –

+0

感謝您的評論。是的,兩個任務中的n值相等,並且temp數組已正確定義。 – Symbolist

+1

那麼,你將不得不提供更多的代碼,因爲這個問題從你提供的內容來看並不明顯。一如既往,一個簡單的,獨立的,可重現的例子是最好的。 –

回答

0

通過設置計數n * sizeof(int),都將增加允許在緩衝區中的條目數以n * sizeof(int)

隨着你的緩衝區的大小,它將是

count * sizeof(int) = n * sizeof(int) * sizeof(int)

記數表示條目的數量。

該程序按預期工作,因爲發送的數組大小小於緩衝區的大小。

2

根據
https://www.open-mpi.org/doc/v1.8/man3/MPI_Recv.3.php
count參數保持在緩衝元件的數量。

count
要接收的元素的最大數量(整數)。

字節數必須通過乘以元素數(count)和每個元素的大小(由MPI_Datatype類型的常量給出)來計算。