web-dev-qa-db-ja.com

MPIでメッセージを送受信するときにタグを使用する場合

MPI send、receive calls。]のtagフィールドに異なる番号を使用する必要があるかどうかはわかりません。 this を読みましたが、理解できません。

Aが多くの異なる種類のメッセージをBに送信しなければならない場合があります。Bがこれらのすべてのメッセージを区別するために特別な措置をとる代わりに、MPIは送信者と受信者がメッセージを含むメッセージID(タグ):プロセスBが特定のタグ番号のメッセージのみを要求する場合、異なるタグのメッセージは、Bが準備できるまでネットワークによってバッファリングされます。

たとえば、プロセスAから「isend」(異なるタグ)を複数呼び出し、プロセスBで「ireceive」を1回だけ呼び出す場合、タグを使用する必要がありますか?

17
FrancescoN

メッセージタグはオプションです。任意の整数値をそれらに使用し、好きなセマンティクスを使用できます。

提案したように、タグを使用して、異なるタイプ(_MPI_INTEGER_、_MPI_REAL_、_MPI_BYTE_など)で構成されるメッセージを区別できます。タグを使用して、データが実際に表すものに関する情報を追加することもできます(nxnマトリックスがある場合、このマトリックスの行を送信するメッセージは、そのマトリックスの列を送信するメッセージと同様に、n値で構成されます。それでも、行と列のデータを異なる方法で処理したい場合があります)。

受信操作は、受信するメッセージのタグと一致する必要があることに注意してください。ただし、これは同じタグを指定する必要があることを意味するものではなく、ワイルドカード_MPI_ANY_TAG_をメッセージタグとして使用することもできます。その後、受信操作は任意のメッセージタグと一致します。 _MPI_Probe_を使用して、送信者が使用したタグを見つけることができます。

12
mort

一般的に、私はそれらを避ける傾向があります。タグを使用する必要はありません。メッセージを解析する前にメッセージサイズを取得する必要がある場合は、MPI_Probe。そうすれば、タグを指定するのではなく、さまざまなメッセージを送信できます。 MPI_Recvでは、データを取得する前にメッセージサイズを知っている必要があります。サイズとタイプが異なる場合、タグを使用すると、複数のスレッドまたはプロセスが異なるサブセットをリッスンすることで、それらを区別できます。タグ1はタイプXのメッセージを意味し、タグ2はタイプYのメッセージを意味します。また、一意のコミュニケーターとグループを作成する作業を行うことなく、複数の「チャネル」のコミュニケーションを可能にします。

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

using namespace std;

int main( int argc, char* argv[] )
{
    // Init MPI
    MPI_Init( &argc, &argv);

    // Get the rank and size
    int rank, size;
    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
    MPI_Comm_size( MPI_COMM_WORLD, &size );

    // If Master
    if( rank == 0 ){

        char* message_r1 = "Hello Rank 1";
        char* message_r2 = "Hello Rank 2";

        // Send a message over tag 0
        MPI_Send( message_r1, 13, MPI_CHAR, 1, 0, MPI_COMM_WORLD );

        // Send a message over tag 1
        MPI_Send( message_r2, 13, MPI_CHAR, 2, 1, MPI_COMM_WORLD );


    }
    else{

        // Buffer
        char buffer[256];
        MPI_Status status;

        // Wait for your own message
        MPI_Recv( buffer, 13, MPI_CHAR, 0, rank-1, MPI_COMM_WORLD, &status );

        cout << "Rank: " << rank << ", Message: " << buffer << std::endl;

    }

    // Finalize MPI
    MPI_Finalize();

}
10
msmith81886

タグは、複数のタイプのメッセージが存在する可能性がある分散コンピューティングアルゴリズムで役立ちます。プロセス(選挙候補者)がタイプrequestVoteのメッセージを送信し、他のプロセスがタイプvoteGrantのメッセージで応答するリーダー選挙問題を考えてみましょう。

メッセージの種類を区別する多くのアルゴリズムがあり、タグはそのようなメッセージを分類するのに役立ちます。

2