1

MPI コンストラクトを使用して C++ プログラムを作成しようとしています。巨大なファイルから読み取り、その数値を配列に格納したい。配列をローカルにしたい、つまり、配列が非常にかさばるので、すべてのスレッドに配列全体を持たせたくありません。各スレッドはローカル計算を行い、さらに計算するために「送信」および「受信」します。これを行う最善の方法は何ですか?オンラインで表示されるすべてのコードは、rand() 関数を使用してローカル配列を生成しますが、ファイルから値を読み取りたいと考えています。

これはおそらく私が欲しいです:

int main() 
{
    // Read from a file
    // store in array a[] temporarily
    //MPI_init();
    //My thread should have an array b[] that is a subset of a[]
    //MY code to do a numerical simulation
    //MPI_finalise();
    return 0;
}

PS: 私のデータ構造は配列よりも複雑です。巨大なグラフを格納します。リンクされたリストの配列またはベクトルの配列に似ています。

4

1 に答える 1

1

MPI は、スレッドではなくプロセス間のメッセージ パッシング システムです。プロセスが異なるマシンで実行されている場合、これは実際の違いです。

実行したい操作がグラフの各部分に完全に依存していない場合は、並列読み取りを行います。他の理由で、配列を読み取って拡散させたい場合は、次のようになります。

int main(int argc, char * argv[]) 
{
    MPI_init(&argc, &argv);
    int prank; MPI_Comm_rank(MPI_COMM_WORLD, &prank);
    int psize; MPI_Comm_size(MPI_COMM_WORLD, &psize);
    if(prank == 0) {
       // Read from a file
       // store in array a[] temporarily

       MPI_Scatter(a, length(a)/psize, MPI_DATATYPE_OF_A, b, leanght(a)/psize, MPI_DATATYPE_OF_A, 0, MPI_COMM_WORLD);
       // this works only if length(a) is a multiple of psize, otherwhy you should go for MPI_Scatterv
    } else {
       MPI_Scatter(NULL, 0, MPI_DATATYPE_OF_A, b, leanght(a)/psize, MPI_DATATYPE_OF_A, 0, MPI_COMM_WORLD);
    }
    //My thread should have an array b[] that is a subset of a[]
    //MY code to do a numerical simulation

    MPI_finalise();
    return 0;
}

しかし、これは配列がある場合の考え方です。グラフがある場合は、グラフ パーティショナーを見てグラフを分割し、断片をさまざまな procs に送信する必要があります。Trilinosがすべてをやってくれると思います。それ以外の場合は、Scotchまたは Metis を使用してグラフに色を付けてから、MPI を使用して各色をプロセッサに送信できます。

于 2013-06-13T09:10:12.157 に答える