2017-01-27 13 views
0

プロセス間でビンが分解されたメッシュを考えてみましょう。イメージ内の数字はプロセスのランクです。受信の受信を停止するプロセスがどのように知っていますか?

各時間ステップでは、ポイントの一部が移動して新しいデスティネーションに送信する必要があります。このポイント送信は、移動されたポイントを有するすべてのプロセスによって行われる。この画像では、左下隅のビンの点のみが例として示されています。

プロセスが受信メッセージを引き続き受信する必要があるかどうかわかりません。問題は、受信者は、ポイントがその地域を通過しない可能性があるので、メッセージが到着するかどうかを知らないことさえあるということです。

また、ポイントの送信元と送信先は、青いポイントと同じである場合があります。

enter image description here

編集:以下の問題を表現する不完全なコードです。

void transfer_points() 
{ 
    world.isend(dest, ...); 
    while (true) 
    { 
     mpi::status msg = world.iprobe(any_source, any_tag); 
     if (msg.count() != 0) 
     { 
      world.irecv(any_source, ...); 
     } 

     // but how long keep probing? 
     if (???) {break;}    
    } 
} 
+0

基本的に特別な停止メッセージを送信する必要があります。 – Zulan

+0

'MPI_Alltoall()'を使って各プロセスからのメッセージ数を知るにはどうしたらいいですか? – Gilles

+0

転送するポイントがない場合でも常にすべてのネイバーにメッセージを送信することをお勧めします。つまり、すべての受信が常に完了します。これがヌルメッセージであることを示すには、特別なタグを使用するか、MPI_Get_countを使用して着信メッセージの長さを調べることができます。 –

答えて

1

MPI_Win_ *操作による片面MPIまたはRMA(リモートメモリアクセス)に精通していますか?私はあなたの問題を理解する方法は、それはそれできちんと解けるようになります。いくつかのポイントを送信

  • ランクがちょうど他のランクのメモリ(ウィンドウ)にそれを置きます。
  • バリア
  • レシーバはここでRMAで送信リングの一例である直接障壁に行って持っている、とのデータ

の所持に今ある(C++の構文で!)。あなたの状況では、ちょっとした修正が必要です。 e。必要であればMPI_Putを呼び出し、バッファに書き込むオフセットについては数学を呼び出します。

#include <iostream> 
#include "mpi.h" 

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

    MPI::Init(argc,argv);  
    int rank = MPI::COMM_WORLD.Get_rank(); 
    int comm_size = MPI::COMM_WORLD.Get_size();  
    int neighbor_left = rank - 1; 
    int neighbor_right = rank + 1; 

    //Left and right most are neighbors. 
    if(neighbor_right >= comm_size) { neighbor_right = 0;} 
    if(neighbor_left < 0) {neighbor_left = comm_size - 1;} 

    int postbox[2]; 
    MPI::Win window = MPI::Win::Create(postbox,2,sizeof(int),MPI_INFO_NULL,MPI::COMM_WORLD); 

    window.Fence(0);  
    // Put my rank in the second entry of my left neighbor (I'm his right neighbor) 
    window.Put(&rank,1,MPI_INT,neighbor_left,1,1,MPI_INT); 
    window.Fence(0);  
    // Put my rank in the first entry of my right neighbor (I'm his left neighbor) 
    window.Put(&rank,1,MPI_INT,neighbor_right,0,1,MPI_INT); 
    window.Fence(0); 

    std::cout << "I'm rank = " << rank << " my Neighbors (l-r) are " << postbox[0] << " " << postbox[1] << std::endl; 

    MPI::Finalize(); 
    return 0; 
} 
+0

RMAが問題を解決できるように見えます。私はこれで終わったときに私は報告します。どうも。 – Shibli

関連する問題