私は非常に単純なタスクを実行していますが、どういうわけかまだ立ち往生しています。
1 つの BIG データ ファイル (「File_initial.dat」) があり、クラスター上のすべてのノードが (MPI を使用して) 読み取る必要があります。各ノードは、この BIG ファイルの一部 (File_size / number_of_nodes) に対して何らかの操作を実行し、最後に各ノードその結果を 1 つの共有 BIG ファイル (「File_final.dat」) に書き込みます。ファイルの要素数は変わりません。
グーグルで調べたところ、データファイルを *.txt" ファイルではなく、バイナリファイル (このファイルには 10 進数しかありません) として書き込む方がはるかに優れていることがわかりました。人間はこのファイルを読み取らず、コンピューターのみを読み取るためです。
私は自分自身を実装しようとしましたが (ただし、バイナリ ファイルではなくフォーマットされた入力/出力を使用して)、これを正しく動作しません。
これまでの私のコードは次のとおりです。
#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;
}
テキストファイルとしてダブルを書き込もうとしているときに、何か間違ったことをしていることを理解しています。
保存できるようにするためにコードを変更する方法
- .txt ファイルとして (フォーマット出力)
- .dat ファイル (バイナリ ファイル) として