0

単一の Xeon Phi ノード (61 コアを搭載) 用のコードを作成しました。私は2つのファイルを持っています。他の mpi 呼び出しを呼び出す前に、MPI_Init(2) を呼び出しました。ntasks を見つけました。mpi 呼び出しも使用してランク付けします。必要なライブラリもすべて含めました。それでもエラーが発生します。これで私を助けてもらえますか?

ファイル 1:

 int    buffsize;
 int    *sendbuff,**recvbuff,buffsum;
 int *shareRegion;
 shareRegion = (int*)gInit(MPI_COMM_WORLD, buffsize, ntasks);   /* gInit is in file 2 */
 buffsize=atoi(argv[1]);
 sendbuff=(int *)malloc(sizeof(int)*buffsize);
 if( taskid == 0 ){
   recvbuff=(int **)malloc(sizeof(int *)*ntasks);
   recvbuff[0]=(int *)malloc(sizeof(int)*ntasks*buffsize);
   for(i=1;i<ntasks;i++)recvbuff[i]=recvbuff[i-1]+buffsize;
 }
 else{
   recvbuff=(int **)malloc(sizeof(int *)*1);
   recvbuff[0]=(int *)malloc(sizeof(int)*1);
 }

 for(i=0;i<buffsize;i++){
     sendbuff[i]=1;

 MPI_Barrier(MPI_COMM_WORLD);

 call(sendbuff, buffsize, shareRegion, recvbuff[0],buffsize,taskid,ntasks);

ファイル 2:

 void* gInit( MPI_Comm comm, int size, int num_proc)
 {
    int share_mem = shm_open("share_region", O_CREAT|O_RDWR,0666 );

    if( share_mem == -1)
     return NULL;
    int rank;
    MPI_Comm_rank(comm,&rank);

    if( ftruncate( share_mem, sizeof(int)*size*num_proc) == -1 )
       return NULL;

    int* shared =  mmap(NULL, sizeof(int)*size*num_proc, PROT_WRITE | PROT_READ,    MAP_SHARED, share_mem, 0);

    if(shared == (void*)-1)
       printf("error in mem allocation (mmap)\n");

    *(shared+(rank)) = 0

    MPI_Barrier(MPI_COMM_WORLD);

    return shared;
 }

 void call(int *sendbuff, int sendcount, volatile int *sharedRegion, int **recvbuff, int recvcount, int rank, int size)
 {
    int i=0;
    int k,j;
    j=rank*sendcount;
    for(i=0;i<sendcount;i++)
    {
      sharedRegion[j] = sendbuff[i];
      j++;
    }

    if( rank == 0)
      for(k=0;k<size;k++)
        for(i=0;i<sendcount;i++)
        {

           j=0;
           recvbuff[k][i] = sharedRegion[j];
           j++;

        }
 }

次に、この recvbuff のファイル 1 で計算を行っています。 sharedRegion 変数を使用しているときに、このセグメンテーション違反が発生します。

4

3 に答える 3

1

MPIはメッセージ パッシングパラダイムを表します。つまり、プロセス (ランク) は分離され、通常は分散マシンで実行されます。それらは明示的な通信メッセージを介して通信します。最近のバージョンでは、一方的な、しかし依然として明示的なデータ転送も許可されています。プロセスが共有メモリを使用できるとは限りません。MPI チュートリアルを見て、MPI の使用方法を確認してください。

実行しているマシンの種類を指定していないため、これ以上の提案は純粋に推測です。実際に共有メモリ マシンを使用している場合は、実際の共有メモリ パラダイム (OpenMP など) を使用することをお勧めします。

于 2013-07-29T09:37:34.900 に答える
0

MPI が 1 台のマシンのみを使用し、メモリを共有するように制限することは可能ですが (特に MPI-3 では、RMA の章を参照してください)、1 台のマシンのみを使用する場合は、他のパラダイムを使用する方が簡単です。

ただし、複数のノードを使用し、1 つのノードで複数のランクを使用する場合 (マルチコア プロセスなど)、MPI-3 RMA を調べて、両方をローカルでどのように支援できるかを確認する価値があるかもしれません。共有メモリとリモート メモリ アクセス。この件については複数の論文が発表されていますが、それらは非常に新しいため、優れたチュートリアルはまだ多くありません。役に立つものを見つけるには、少し掘り下げる必要があります。

于 2013-07-29T12:51:30.673 に答える
0

これら 2 行の順序は次のとおりです。

shareRegion = (int*)gInit(MPI_COMM_WORLD, buffsize, ntasks);   /* gInit is in file 2 */
buffsize=atoi(argv[1]);

buffsizeの呼び出しの前後で値が異なる可能性があることを示唆していますgInitbuffsizeプログラムの最初の引数で渡された as が呼び出されている間に初期値よりも大きい場合、後でgInit範囲外のメモリ アクセスが発生し、セグメンテーション フォールトが発生します。

mpirunヒント:デバッガー内からMPI シングルトン (例: なし) としてコードを実行するgdbか (例: )、コアがエラー時にダンプされるように制限を変更し (例: ありulimit -c unlimited)、デバッガーでコア ファイルを調べます。このような場合、デバッグ情報を使用してコンパイルすると (-gコンパイラ オプションに追加するなど)、大いに役立ちます。

于 2013-07-29T16:39:53.637 に答える