我注意到一個奇怪的事情,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
您正在正確閱讀文檔,並且發佈的Send/Recv行沒有問題,這表明其他地方存在問題。兩個任務中的temp和n是否都正確定義? –
感謝您的評論。是的,兩個任務中的n值相等,並且temp數組已正確定義。 – Symbolist
那麼,你將不得不提供更多的代碼,因爲這個問題從你提供的內容來看並不明顯。一如既往,一個簡單的,獨立的,可重現的例子是最好的。 –