0

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
4

4 に答える 4

3

標準のC++/ Cライブラリは、その数のファイルにアクセスするには十分ではありません。同時に数十万のファイルにアクセスしようとすると、BG / L / Pカーネルでさえ崩壊します。これは、あなたの数に非常に近いものです。多数の物理ファイルも、追加のメタデータを使用して並列システムに負荷をかけます。

洗練されたスーパーコンピューターには、通常、専用のI /Oノードが多数あります。並列I/Oに標準のMPI機能を利用してみませんか?保存したいファイルの数はこれで十分です。

ここから始めることができます:http ://www.open-mpi.org/doc/v1.4/man3/MPI_File_open.3.php

幸運を!

于 2013-03-01T21:14:56.237 に答える
2

自分で IO を行う必要がありますか? そうでない場合は、 HPC を使用する科学者の間で非常に人気のあるHDF5 ライブラリを試すことができます。それを見ていると、作業が簡単になるかもしれません。たとえば、同じファイルに何かを書き込んで、何千ものファイルを避けることができます。(パフォーマンスは、クラスターのファイルシステムにも依存する可能性があることに注意してください)

于 2013-03-01T07:24:24.960 に答える
1

使用している7つのスレッドまたはプロセスを作成し、書き込み中のファイルにthreadid / processidを追加します。このように競合があってはなりません。

于 2013-03-01T06:30:49.840 に答える
1

Blue Gene アーキテクチャーはあと数年しか残っていないかもしれませんが、「スケーラブルな I/O」をどのように行うかという問題はしばらく残ります。

まず、MPI-IO は基本的にこの規模での要件であり、特に集合 I/O 機能です。このホワイト ペーパーは /L 向けに書かれていますが、教訓は依然として関連しています。

  • 集合的なオープンにより、ライブラリはいくつかの最適化を設定できます
  • 集合的な読み取り/書き込みは、GPFS ファイル システムのブロック境界とうまく一致する要求に変換できます (これは、ロック管理とオーバーヘッドの最小化にとって重要です)。
  • 「I/O アグリゲーター」の選択と配置は、マシンのトポロジーを意識した方法で行うことができます

https://press3.mcs.anl.gov/romio/2006/02/15/romio-on-blue-gene-l/

/Q でのアグリゲーターの選択はかなり複雑ですが、利用可能なすべての「システム コール I/O 転送」(ciod) リンクで I/O のバランスを取るために、これらのアグリゲーターが選択されるという考え方です。

https://press3.mcs.anl.gov/romio/2015/05/15/aggregation-selection-on-blue-gene/

于 2015-05-26T14:43:32.957 に答える