4

私は非常に単純なタスクを実行していますが、どういうわけかまだ立ち往生しています。

1 つの BIG データ ファイル (「File_initial.dat」) があり、クラスター上のすべてのノードが (MPI を使用して) 読み取る必要があります。各ノードは、この BIG ファイルの一部 (File_size / number_of_nodes) に対して何らかの操作を実行し、最後に各ノードその結果を 1 つの共有 BIG ファイル (「File_final.dat」) に書き込みます。ファイルの要素数は変わりません。

  1. グーグルで調べたところ、データファイルを *.txt" ファイルではなく、バイナリファイル (このファイルには 10 進数しかありません) として書き込む方がはるかに優れていることがわかりました。人間はこのファイルを読み取らず、コンピューターのみを読み取るためです。

  2. 私は自分自身を実装しようとしましたが (ただし、バイナリ ファイルではなくフォーマットされた入力/出力を使用して)、これを正しく動作しません。

これまでの私のコードは次のとおりです。

#include <fstream>
#define NNN 30

int main(int argc, char **argv)
{   
    ifstream fin;

    // setting MPI environment

    int rank, nprocs;
    MPI_File file;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    // reading the initial file

    fin.open("initial.txt");
    for (int i=0;i<NNN;i++)
    {  
        fin  >> res[i];
        cout << res[i] << endl; // to see, what I have in the file
    }  
    fin.close();

    // starting position in the "res" array as a function of "rank" of process
    int Pstart = (NNN / nprocs) * rank ;
    // specifying Offset for writing to file
    MPI_Offset offset = sizeof(double)*rank;
    MPI_File file;
    MPI_Status status;

    // opening one shared file
    MPI_File_open(MPI_COMM_WORLD, "final.txt", MPI_MODE_CREATE|MPI_MODE_WRONLY,
                          MPI_INFO_NULL, &file);

    // setting local for each node array

    double * localArray;
    localArray = new double [NNN/nprocs];

    // Performing some basic manipulation (squaring each element of array)
    for (int i=0;i<(NNN / nprocs);i++)
    {
        localArray[i] = res[Pstart+i]*res[Pstart+i];
    }

    // Writing the result of each local array to the shared final file:

    MPI_File_seek(file, offset, MPI_SEEK_SET);
    MPI_File_write(file, localArray, sizeof(double), MPI_DOUBLE, &status);
    MPI_File_close(&file);

    MPI_Finalize();

    return 0;
}

テキストファイルとしてダブルを書き込もうとしているときに、何か間違ったことをしていることを理解しています。

保存できるようにするためにコードを変更する方法

  1. .txt ファイルとして (フォーマット出力)
  2. .dat ファイル (バイナリ ファイル) として
4

1 に答える 1

4

バイナリ ファイルの出力はほぼ正しいです。ただし、ファイル内のオフセットと書き込むデータ量の計算は正しくありません。オフセットを

MPI_Offset offset = sizeof(double)*Pstart;

いいえ

MPI_Offset offset = sizeof(double)*rank;

nprocs=5そうしないと、(30/5)*3 = 18 ではなく、(たとえば) ランク 3 がファイル内の倍数 3 で書き込みを開始するため、各ランクが互いのデータを上書きすることになります。

また、各ランクにNNN/nprocsdouble ではなくsizeof(double)double を書き込む必要があります。

MPI_File_write(file, localArray, NNN/nprocs, MPI_DOUBLE, &status);

テキスト ファイルとして書き込む方法は、はるかに大きな問題です。データを内部で文字列に変換してから、それらの文字列を出力する必要があります。慎重に書式設定して、各行に必要な文字数を確認してください。これについては、このサイトのこの回答で説明されています。

于 2013-03-21T12:29:33.037 に答える