CI で実装された数値ルーチンでは、ファイル (ascii) からデータを読み取る必要があります。データは数値計算の入力として必要であり、一般に大きすぎてメモリに収まりません。したがって、ルーチンにフィードするために動的に配列にプリフェッチする必要があります (そうしないと、ファイルの読み取りが計算のボトルレンクになります)。stdlib、おそらくposixスレッドまたはMPIを使用してこれを行う確立された/簡単な方法はありますか? Linux で intels MPI ライブラリを使用しています。
func
次の疑似コードのルーチンは、数値コア ルーチンを表しています。これは、たとえば常微分方程式のソルバーによって非常に頻繁に呼び出されます。の既知の値を持つi
のランダムな float 値で呼び出されるたびに。そのため、ファイルのどのデータ値が次のステップで必要になるかを大まかに知ることができる初期情報がいくつかあります。x[i-1]<x[i]<x[i-1]+D
D
x
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 倍になります (外部操作に必要な時間を無視します)。ブロックが読み取りよりも時間がかかる場合は、簡単に並列化できることに注意してください。今の読者にはできないこと。