2016-05-12 79 views
2

我想通過將其發送給其他人使用共享陣列中MPI程序,使得後一個過程完成其工作,它將把它的秩成陣列和「更新」其無需等待。我嘗試將MPI_Bcast作爲「root」參數作爲正在運行的進程的等級(而不是0),但是當我從每個進程顯示數組時,它只顯示本地發生的更改(其他等級發送不在數組中) 。使用共享陣列中消息傳遞接口

int array[10]; 
array[rank] = rank; 
MPI_Bcast(array,10,MPI_INT,rank,MPI_COMM_WORLD); 
printf("%d, %d - ",array[0],array[1]); //displays: 0, 26872 - 32678, 1 

感謝您的幫助。

+0

可將一個代碼? –

+0

int數組[10]; array [rank] = rank; MPI_Bcast(array,10,MPI_INT,rank,MPI_COMM_WORLD); printf(「%d,%d - 」,數組[0],數組[1]); //顯示:0,26872 - 32678,1 – Reda94

+3

請不要在註釋中放置代碼。相反,[編輯]你的問題,並把它放在那裏。謝謝! –

回答

0

鍵入在主一個MPI程序的int array[10];不生成共享陣列。每個進程處理它自己的數組版本。 MPI_Bcast()已被設計爲給定過程root將其陣列版本廣播到所有其他過程的方式。因此,所有其他進程上的陣列的初始版本都將被刪除。

MPI_Bcast()是一個集體操作:傳播者的每個進程必須調用MPI_Bcast()使用相同的root。計數和類型可以不同,但​​由根發送的數據量必須等於所有進程收到的數量。

兩個選項來解決問題:

  • ,你正在尋找可能MPI_Allgather()功能。請參見these schemesMPI_Allgather()可用於在通過本地進程修改後同步全局數組。全局數組不是「共享」的,因爲每個進程在內存中使用不同的空間,但在調用MPI_Allgather()之後,不同進程的值將類似。
  • 您正在尋找一個真正的共享array.Such陣列可以通過調用MPI_Win_allocate_shared()進行分配。見version 3.1 of the MPI standard第11.2.3窗口分配共享內存407頁特別是,必須注意,如果你正在運行使用羣集的多個節點計劃支付給以下警告:

    這是用戶的確保通信器通信代表一組進程,可以創建一個共享內存段,該組可以被組中的所有進程訪問。

    你可以找到和MPI_Win_allocate_shared()there

在下面的例子爲例,我會假設你在第一個選項interrested。它由mpicc main.c -o main編譯並由mpirun -np 42 main運行。

#include <mpi.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc,char *argv[]) 
{ 

    int size, rank; 
    MPI_Init(&argc,&argv); 
    MPI_Comm_rank(MPI_COMM_WORLD,&rank); 
    MPI_Comm_size(MPI_COMM_WORLD,&size);  


    int* array=malloc(size*sizeof(int)); 
    if(array==NULL){fprintf(stderr,"malloc failed\n");exit(1);} 

    //modifying the local portion of the array 
    array[rank]=rank; 

    //gather content from each process and broadcast it to all processes 
    MPI_Allgather(&array[rank],1,MPI_INT,array,1,MPI_INT,MPI_COMM_WORLD); 

    //each process has its own copy of the array, but the values are the same. 
    int i,j; 
    for(i=0;i<size;i++){ 
     if(i==rank){ 
      printf("rank %d got ",rank); 
      for(j=0;j<size;j++){ 
       printf("%d ",array[j]); 
      } 
      printf("\n"); 
     } 
     MPI_Barrier(MPI_COMM_WORLD); 
    } 

    free(array); 
    MPI_Finalize(); 
    return 0; 
} 
+0

嗨弗朗西斯,非常感謝您的回覆!從昨天起,我現在對第二個選項更感興趣,因爲第一個選項是阻塞的,在我的情況下,我真的不希望它是:[這是我真正想要完成的](http://stackoverflow.com /問題/ 37208229/MPI-過程幫助,另一個,一當-IT-完成,其工作) – Reda94