2011-07-13 8 views
0

私は以下のようなプログラムを持っています。以下のコードでは、すべてのプロセスが他のすべてのプロセスの現在の反復ステップを認識しています。しかし、MPI_PUT、のような集合的な呼び出しなしでこれを行う方法があるのであれば、私は興味があります。特に、各プロセスが異なるレートで反復する場合はです。MPI(Asynchronous)Loop Iteration

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


/* OUTPUT 
* $ mpirun -np 4 so00.exe 
* @[0]: p |  0  1  2  3 
* @[0]: p |  4  5  6  7 
* @[0]: p |  8  9  10  11 
* @[0]: p |  12  13  14  15 
* @[0]: p |  16  17  18  19 
* @[1]: p |  0  1  2  3 
* @[1]: p |  4  5  6  7 
* @[1]: p |  8  9  10  11 
* @[1]: p |  12  13  14  15 
* @[1]: p |  16  17  18  19 
* @[2]: p |  0  1  2  3 
* @[2]: p |  4  5  6  7 
* @[2]: p |  8  9  10  11 
* @[2]: p |  12  13  14  15 
* @[2]: p |  16  17  18  19 
* @[3]: p |  0  1  2  3 
* @[3]: p |  4  5  6  7 
* @[3]: p |  8  9  10  11 
* @[3]: p |  12  13  14  15 
* @[3]: p |  16  17  18  19 
*/ 
int main(int argc, char *argv[]) 
{ 
    int i, n, rank, np; 

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

    //////////////////////////////////////////////////////////////////////////// 

    int *pos; 
    MPI_Win win; 
    MPI_Alloc_mem(sizeof(int)*np, MPI_INFO_NULL, &pos); 
    MPI_Win_create(pos, np, sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &win); 

    for (i=rank; i<(np*5); i+=np) 
    { 
     MPI_Win_fence(MPI_MODE_NOPRECEDE, win); 
     for (n = 0; n < np; n++) 
     { 
      MPI_Put(&i, 1, MPI_INT, n, rank, 1, MPI_INT, win); 
     } 
     MPI_Win_fence((MPI_MODE_NOSTORE | MPI_MODE_NOSUCCEED), win); 
     printf("@[%d]: p | ", rank); 
     for (n = 0; n < np; n++) printf("\t%d", pos[n]); 
     printf("\n"); 
    } 

    //////////////////////////////////////////////////////////////////////////// 

    MPI_Win_free(&win); 
    MPI_Free_mem(pos); 

    MPI_Finalize(); 

    return EXIT_SUCCESS; 
} 
+0

MPI_Putは一括呼び出しではありません。 – powerrox

+0

ああ、私はそれをMPI_Win_fenceと混同していると思います... – dnanto

+0

RMAコールを使う前にMPI_Win_fenceを避けることはできません。その要件。外部のforループからフェンスを移動することによって、コードを最適化することができます。今のところ、NOPRECEDE&NOSUCCEEDは現在の場所では適切ではありません。 – powerrox

答えて

0

MPI_Win_fenceを使用してMPIでRMAコールを同期する必要はありません。 MPI_Lock(およびその亜種)を使用して、「パッシブターゲット」モードを実行することもできます。このモードは、「アクティブターゲット」モードが行う総括コールのすべてを必要としないため、同期がはるかに少なくなります。

ここで完全な答えを出すのはあまりにも複雑ですが、ウェブ上のドキュメントとともに、件名に関する多くの論文を見つけることができます。完全なMPI-3標準はhereです。片面通信のための第11章を見てください。