2014-12-04 66 views
0

我正在使用MPI執行代碼並行化以評估成本函數。在C中使用MPI進行代碼並行化

我在8個處理器中分配人口50,000點。

我試圖並行下面的代碼,但它掙扎:

//mpiWorldSize is number of processors 
//===================================== 

for (int k=1; k< mpiWorldSize; k++) 
{ 
    MPI_Send(params[1][mpiWorldRank*over+k],7,MPI_INT, 0,0,MPI_COMM_WORLD); 
} 

// evaluate all the new costs 
//========================= 

for (int j=1; j<mpiWorldSize;j++) 
{ 
    MPI_Recv(params[1][mpiWorldRank*over+k],7,MPI_INT,j,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE); 
} 

// memory allocation 
//========================= 

SecNewCostValues = (float*) malloc(noOfDataPerProcessor/bufferLength); 

//loop throw nuber of data per proc 

for (i = 0; i < over; i++) 
{ 
    if(mpiWorldRank != 0) 
    { 
     SecNewCostValues[i] = cost(params[1][mpiWorldRank*noOfDataPerPreocessor+i]); 
     newCostValues[over] = cost(params[1][i]); //change the i part to rank*nodpp+i 
     printf("hello from rank %d: %s\n", mpiWorldRank ,procName); 
    } 
} 

我無法發送和接收來自不同處理器的數據,除了0

我會明白任何幫助。

感謝

+0

我建議你也加上'mpi'標籤 – jev 2014-12-04 22:42:50

回答

1

MPI使用小號英格爾程序多數據消息傳遞編程模型,這是所有MPI進程執行同一個程序,你需要使用條件來決定哪些過程將執行代碼的哪一部分。你的代碼的總體結構可能如下(假設0級主人分配工作和工作人員接受工作)。

if (myrank == 0) { // master 
    for (int k = 1; k < mpiWorldSize; k++) { // send a chunk to each worker 
    MPI_Send(...); 
    } 
} 
else { // worker 
    MPI_Recv(...); // receive work 
} 

類似的主人會收集工作。查看關於MPI_Scatter()MPI_Gather()似乎相關的集體通信功能的文檔。