C++ と MPI でコードを実装しました。このコードは、数百万回の計算を実行し、データを処理する各 CPU の約 7 つのファイルに数百万個の数値を保存します。また、約 10,000 個のコアを使用しているため、合計で 70,000 個のファイルがあり、数百万行のコードが並行して書き込まれます。
書き込みには ofstream を使用しましたが、何らかの理由で MPI コードが途中で壊れ、ファイルが空のように見えます。私は各プロセッサが他のすべてのプロセッサよりも独立して7つのファイルを書き込めるようにしたいと思っています.実行中にファイル名を動的に指定します。それが正しい方法である場合、誰かができるだけ詳細に説明してもらえますか? そうでない場合は、他の提案をできるだけ詳しく説明してください。
うまくいかない私の現在の文章は次のようになります。
if (rank == 0)
{
if(mkdir("Database",0777)==-1)//creating a directory
{
}
rowsCount = fillCombinations(BCombinations, RCombinations,
BList, RList,
maxCombinations, BIndexBegin,
BIndexEnd, RIndexBegin,
RIndexEnd,
BCombinationsIndex, RCombinationsIndex
);
}
//then broad cast all the arrays that will be used in all of the computations and at the root
//send all the indexes to work on on the slaves then at the slave
or (int cc = BeginIndex ; cc <= EndIndex; cc++)
{
// begin by specifying the values that will be used
// and making files for each B and R in the list
BIndex = betaCombinationsIndex [cc];
RIndex = roughCombinationsIndex [cc];
//creating files to save data in and indicating the R and B by their index
//specifying files names
std::string str1;
std::ostringstream buffer1;
buffer1 << "Database/";
str1 = buffer1.str();
//specifying file names
std::ostringstream pFileName;
std::string ppstr2;
std::ostringstream ppbuffer2;
ppbuffer2 <<"P_"<<"Beta_"<<(BIndex+1)<<"_Rho_"<<(RIndex+1)<<"_sampledP"<< ".txt";
ppstr2 = ppbuffer2.str();
pFileName <<str1.c_str()<<ppstr2.c_str();
std::string p_file_name = pFileName.str();
std::ostringstream eFileName;
std::string eestr2;
std::ostringstream eebuffer2;
eebuffer2 <<"E_"<<"Beta_"<<(BIndex+1)<<"_Rho_"<<(RIndex+1)<<"_sampledE"<< ".txt";
eestr2 = eebuffer2.str();
eFileName <<str1.c_str()<< eestr2.c_str();
std::string e_file_name = eFileName.str();
// and so on for the 7 files ....
//creating the files
ofstream pFile;
ofstream eFile;
// and so on for the 7 files ....
//opening the files
pFile .open (p_file_name.c_str());
eFile .open (e_file_name.c_str());
// and so on for the 7 files ....
// then I start the writing in the files and at the end ...
pFile.close();
eFile.close();
}
// end of the segment loop