2016-05-14 4 views
1

私はプロセス間で共有メモリを使いたいと思います。私はMPI_Win_allocate_sharedを試してみましたが、私はプログラムを実行するとき、それは私に奇妙なエラーを与える:MPI:MPI_Win_allocate_sharedを正しく使うには

アサーションはライン592でファイル./src/mpid/ch3/include/mpid_rma_shm.hに失敗しました:local_target_rank >= 0 internal ABORT

はここに私のソースです:

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

# include "mpi.h" 

int main (int argc, char *argv[]); 
void pt(int t[], int s); 

int main (int argc, char *argv[]) 
{ 
    int rank, size, shared_elem = 0, i; 
    MPI_Init (&argc, &argv); 
    MPI_Comm_rank (MPI_COMM_WORLD, &rank); 
    MPI_Comm_size (MPI_COMM_WORLD, &size); 
    MPI_Win win; 
    int *shared; 

    if (rank == 0) shared_elem = size; 
    MPI_Win_allocate_shared(shared_elem*sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &shared, &win); 
    if(rank==0) 
    { 
     MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, MPI_MODE_NOCHECK, win); 
     for(i = 0; i < size; i++) 
     { 
      shared[i] = -1; 
     } 
     MPI_Win_unlock(0,win); 
    } 
    MPI_Barrier(MPI_COMM_WORLD); 
    int *local = (int *)malloc(size * sizeof(int)); 
    MPI_Win_lock(MPI_LOCK_SHARED, 0, 0, win); 
    for(i = 0; i < 10; i++) 
    { 
     MPI_Get(&(local[i]), 1, MPI_INT, 0, i,1, MPI_INT, win); 
    } 
    printf("processus %d (avant): ", rank); 
    pt(local,size); 
    MPI_Win_unlock(0,win); 

    MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win); 

    MPI_Put(&rank, 1, MPI_INT, 0, rank, 1, MPI_INT, win); 

    MPI_Win_unlock(0,win); 

    MPI_Win_lock(MPI_LOCK_SHARED, 0, 0, win); 
    for(i = 0; i < 10; i++) 
    { 
     MPI_Get(&(local[i]), 1, MPI_INT, 0, i,1, MPI_INT, win); 
    } 
    printf("processus %d (apres): ", rank); 
    pt(local,size); 
    MPI_Win_unlock(0,win); 


    MPI_Win_free(&win); 
    MPI_Free_mem(shared); 
    MPI_Free_mem(local); 
    MPI_Finalize (); 

    return 0; 
} 

void pt(int t[],int s) 
{ 
    int i = 0; 
    while(i < s) 
    { 
     printf("%d ",t[i]); 
     i++; 
    } 
    printf("\n"); 
} 

私が手結果:

processus 0 (avant): -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
processus 0 (apres): 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 
processus 4 (avant): 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 
processus 4 (apres): 0 -1 -1 -1 4 -1 -1 -1 -1 -1 
Assertion failed in file ./src/mpid/ch3/include/mpid_rma_shm.h at line 592: local_target_rank >= 0 
internal ABORT - process 5 
Assertion failed in file ./src/mpid/ch3/include/mpid_rma_shm.h at line 592: local_target_rank >= 0 
internal ABORT - process 6 
Assertion failed in file ./src/mpid/ch3/include/mpid_rma_shm.h at line 592: local_target_rank >= 0 
internal ABORT - process 9 

誰かが私を助けてくれますか?何が間違っているのかを確かめてください。&このエラーは何を意味していますか?どうもありがとう。

答えて

3

MPI_Win_allocate_sharedは、MPIの非常に抽象的な性質からの出発点です。これは、基礎となるメモリ構成を公開し、プログラムが高価な(しばしば混乱しやすい)MPI RMA操作をバイパスし、そのようなシステムで共有メモリを直接利用することを可能にします。 MPIは、通常、ランクが物理メモリアドレス空間を共有しない環境であるdistributed-memoryを処理しますが、現在一般的なHPCシステムは多くの相互接続されたshared-memoryノードで構成されています。したがって、同じノードで実行されるランクが共有メモリセグメントにアタッチし、メッセージの受け渡しではなくデータを共有することによって通信することが可能です。典型的なクラスタで

MPI_Comm_split_type(comm, MPI_COMM_TYPE_SHARED, key, info, &newcomm); 

、この本質的にグループランクによって:

MPIは、1つのそのような各サブグループ内のランクは、メモリを共有することができることランクのサブグループを作成することを可能にする通信分割操作を提供しますそれらが実行するノード分割が完了すると、共有メモリのウィンドウ割り振りが各newcommのランクで実行されます。マルチノードクラスタジョブの場合、これはいくつかの独立したコミュニケータ、したがっていくつかの共有メモリウィンドウをもたらすことに注意してください。 1つのノードのランクは、他のノードの共有メモリウィンドウを見ることができません。

この点に関して、MPI_Win_allocate_sharedは、共有メモリ割り当てのためのOS固有のメカニズムに関するプラットフォームに依存しないラッパーです。

+1

こんにちは!私はまだ私がなぜエラーを得ているのか分からない... – Reda94

+0

すべてのプロセスが同じノードで実行されていますか? –

+0

@Hristollievはい私の場合はそうですが、それはテストのためのものです。すべてが動作するようになったら、ネットワークで接続された他のコンピュータでテストします... – Reda94

0

このコードにはいくつかの問題があります。これらのうちのいくつかはHristollievの答えで言及されています。

  1. 同じノード内のすべてのプロセスを実行して、ノード間通信機能を使用するか、コミュニケータ分割機能を共有する必要があります。
  2. 少なくとも10個のプロセスでこのコードを実行する必要があります。
  3. 第3に、localfree()で割り当て解除する必要があります。
  4. クエリからsharedポインタを取得する必要があります。
  5. あなたは(私はこれがWin_freeで世話をしていると思う)sharedの割り当てを解除する必要があります

これは、結果のコードです:

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

# include "mpi.h" 

int main (int argc, char *argv[]); 
void pt(int t[], int s); 

int main (int argc, char *argv[]) 
{ 
    int rank, size, shared_elem = 0, i; 
    MPI_Init (&argc, &argv); 
    MPI_Comm_rank (MPI_COMM_WORLD, &rank); 
    MPI_Comm_size (MPI_COMM_WORLD, &size); 
    MPI_Win win; 
    int *shared; 

// if (rank == 0) shared_elem = size; 
// MPI_Win_allocate_shared(shared_elem*sizeof(int), sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &shared, &win); 

    if (rank == 0) 
    { 
     MPI_Win_allocate_shared(size, sizeof(int), MPI_INFO_NULL, 
           MPI_COMM_WORLD, &shared, &win); 
    } 
    else 
    { 
     int disp_unit; 
    MPI_Aint ssize; 
     MPI_Win_allocate_shared(0, sizeof(int), MPI_INFO_NULL, 
           MPI_COMM_WORLD, &shared, &win); 
     MPI_Win_shared_query(win, 0, &ssize, &disp_unit, &shared); 
    } 


    if(rank==0) 
    { 
     MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, MPI_MODE_NOCHECK, win); 
     for(i = 0; i < size; i++) 
     { 
      shared[i] = -1; 
     } 
     MPI_Win_unlock(0,win); 
    } 

    MPI_Barrier(MPI_COMM_WORLD); 

    int *local = (int *)malloc(size * sizeof(int)); 
    MPI_Win_lock(MPI_LOCK_SHARED, 0, 0, win); 
    for(i = 0; i < 10; i++) 
    { 
     MPI_Get(&(local[i]), 1, MPI_INT, 0, i,1, MPI_INT, win); 
    } 
    printf("processus %d (avant): ", rank); 
    pt(local,size); 
    MPI_Win_unlock(0,win); 

    MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win); 

    MPI_Put(&rank, 1, MPI_INT, 0, rank, 1, MPI_INT, win); 

    MPI_Win_unlock(0,win); 

    MPI_Win_lock(MPI_LOCK_SHARED, 0, 0, win); 
    for(i = 0; i < 10; i++) 
    { 
     MPI_Get(&(local[i]), 1, MPI_INT, 0, i,1, MPI_INT, win); 
    } 
    printf("processus %d (apres): ", rank); 
    pt(local,size); 
    MPI_Win_unlock(0,win); 


    MPI_Win_free(&win); 
// MPI_Free_mem(shared); 
    free(local); 
// MPI_Free_mem(local); 
    MPI_Finalize (); 
    return 0; 


} 

void pt(int t[],int s) 
{ 
    int i = 0; 
    while(i < s) 
    { 
     printf("%d ",t[i]); 
     i++; 
    } 
    printf("\n"); 
}