2017-05-16 5 views
1

MPIプログラムには、MPIプログラム全体で転送されるバイト数の合計がどのように計算されますか?プログラムによって転送された合計MPIバイト数を取得する

uint64_t bytes_recv = 0; 

void CommRecv(MyObject* a){ 
    MPI_Status status; 

    MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 

    int msg_size; 
    MPI_Get_count(&status, MPI_BYTE, &msg_size); 
    bytes_recv += msg_size; 

    // Allocate a buffer to hold the incoming data 
    char* buf = (char*)malloc(msg_size); 
    assert(buf!=NULL); 

    MPI_Recv(buf, msg_size, MPI_BYTE, from, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 

    //Do stuff 

    free(buf); 
} 

ここでのポイントは、データ転送の統計情報を追跡する機能を標準MPI通信機能をラップすることです:私は直接の知っているが、あなたはあなたの目的に次のコードを適応させることができることを

+2

外部ツールやプロファイリングライブラリを使用したことがありますか? ITACやMPIPのようなもの – Gilles

答えて

0

ありません。内部的には、これらの関数は、受信メッセージのサイズを取得するためにMPI_Get_count()を使用します。これは、ラップされたすべてのMPI関数の通信を追跡するグローバル変数に追加されます。

プログラムの最後に、各インスタンスのグローバル変数をマスタープロセスに蓄積することができます。

+0

こんにちは、私はMPIプログラミングの新人ですが、私はbytes_recvだけが私の場合のために仕事をすると思うのです。私は余分なMPI_recvを必要としませんか、それとも重要なことをしますか? –

+0

いいえ、余分な 'MPI_recv'は何も重要ではありません。あなたはそれが役に立つと思うかもしれません。バイト数を変更することなく、コード内のどこでも 'My_MPI_Recv'を呼び出すことができます。 – Richard

4

最も簡単な方法は、mpiPなどのMPIプロファイリングツールを使用することです。 Score-Pのような、より洗練された/重量のあるツールもあります。 HPCサイトでコードを実行している場合は、何かがあるかどうかを確認する必要があります。

関連する問題