2011-03-05 18 views
1

我正在解決這個問題。我正在實施循環映射,我有4個處理器,所以一個任務映射到處理器1(根)上,然後另外三個是工作人員。我正在使用循環映射,並且我輸入了幾個整數,例如0-40。我希望每個工作人員都能接受(在這種情況下,每個工作人員可能需要10個整數),做一些計算並保存。MPI - 從任務0(根)接收多個int

我正在使用MPI_Send從根發送整數,但我不怎麼乘以相同的進程(根)接收一些數字。另外,我發送int的緩衝區大小固定爲1,當有數字例如12,它會做壞事。如何檢查int的長度?

任何意見,將不勝感激。謝謝

回答

4

我假設你在C++中工作,雖然你的問題沒有說。無論如何,讓我們看看MPI_Send的參數:

MPI_SEND(buf, count, datatype, dest, tag, comm) 

第二個參數指定要發送多少個數據項。這個調用基本上意味着「buf指向內存中的一個點,其中有count個數值,它們全都是datatype,一個接一個地發送它們:」。這使您可以發送內容的整個陣列的,就像這樣:

int values[10]; 
for (int i=0; i<10; i++) 
    values[i] = i; 
MPI_Send(values, 10, MPI_INTEGER, 1, 0, MPI_COMM_WORLD); 

這將開始在values開始讀取內存,並保持閱讀,直到10 MPI_INTEGER■找被讀取。

對於您的進程之間分配號碼時,這是你如何與MPI_SEND做到這一點:

int values[40]; 
for (int i=0; i<40; i++) 
    values[i] = i; 
for (int i=1; i<4; i++) // start at rank 1: don't send to ourselves 
    MPI_Send(values+10*i, 10, MPI_INTEGER, i, 0, MPI_COMM_WORLD); 

但是,這是在分佈式計算這樣一個共同的操作,MPI給予它自己的功能,MPI_Scatter 。 Scatter完全符合你的要求:它需要一個數組並將其平均分配給所有調用它的進程。這是一個collective communication調用,這是一個稍微高級的話題,所以如果你剛剛學習MPI(它聽起來像你),那麼可以跳過它,直到你適應MPI_Send和MPI_Recv。