0

CI で実装された数値ルーチンでは、ファイル (ascii) からデータを読み取る必要があります。データは数値計算の入力として必要であり、一般に大きすぎてメモリに収まりません。したがって、ルーチンにフィードするために動的に配列にプリフェッチする必要があります (そうしないと、ファイルの読み取りが計算のボトルレンクになります)。stdlib、おそらくposixスレッドまたはMPIを使用してこれを行う確立された/簡単な方法はありますか? Linux で intels MPI ライブラリを使用しています。

func次の疑似コードのルーチンは、数値コア ルーチンを表しています。これは、たとえば常微分方程式のソルバーによって非常に頻繁に呼び出されます。の既知の値を持つiのランダムな float 値で呼び出されるたびに。そのため、ファイルのどのデータ値が次のステップで必要になるかを大まかに知ることができる初期情報がいくつかあります。x[i-1]<x[i]<x[i-1]+DDx

read_file(x,data)
{
   /* code to search x-dependent data in file */
   data[i]=...;
}

func(x)
{

   read_file(x,&data);

   /* several data- and x-dependent operations */
   result= ...;

  return result;

}

ブロック/* several data- and x-dependent operations */(およびいくつかの外部コード) が実行されている間、原則として、次の呼び出しで必要なデータをfuncファイルからバッファ配列に並列にプリフェッチできます。次の呼び出しでは、ファイルではなく配列内の情報を検索できます。並行してデータをプリフェッチするために必要なコードと、read_file (次のステップでどのデータが必要になるかをファイル リーダーに伝える部分) の代わりを要求します。理想的には、/* several data- and x-dependent operations */ブロックがファイルの検索と同じくらいの時間を必要とする場合、後で余分な時間がかからないでしょう。コードがそのままの場合、実行時間は約 2 倍になります (外部操作に必要な時間を無視します)。ブロックが読み取りよりも時間がかかる場合は、簡単に並列化できることに注意してください。今の読者にはできないこと。

4

1 に答える 1

3

まず、ASCII ファイルをバイナリ ファイルに変換することをお勧めします (たとえば、ネイティブ double を ASCII 文字列ではなく 8 バイトとして格納するなど)。私は、高解像度の FEM モデルを実行しているときに、非常によく似た問題に悩まされてきました。三角形を使用してメッシュを準備していました。残念ながら、ASCII 入出力しかなく、大きなメッシュの場合、データの読み取りに時間がかかりました! 本当。バイナリ io のサポートを追加するために三角形にパッチを適用したところ、すべての問題が解消されました。標準の fread を使用して、ファイルから割り当てられたメモリにデータを取得できます。確かに、連続したチャンクにアクセス/読み取りできるように、合理的な方法でそれらをファイルに保存する必要があります。

特に浮動小数点数の場合、ASCII データの解析は非常にコストがかかるため、これを行うようにしてください。それでも問題が解決しない場合は、その間に他のスレッドが計算を実行している間にデータを読み込むバックグラウンド スレッド/ワーカーを開始することをお勧めします。共有メモリ コンピューターでは単純に pthreads を使用し、クラスター バージョンのコードを処理するのは MPI に任せます。必要なものによって異なります。

マルチスレッド IO を使用する場合、探しているのは従来のプロデューサー/コンシューマー ソリューションです。任意の言語での単純な実装と、好きなスレッド ライブラリを使用した例がたくさんあります。pthread を使用した並行コンピューティングの古典的な例について説明しているこのページをご覧ください。

于 2012-09-19T19:12:49.673 に答える