各反復で呼び出される行列乗算を並列化することにより、かなり複雑な反復アルゴリズムのパフォーマンスを向上させようとしています。このアルゴリズムには 500 回の反復と約 10 秒かかります。しかし、行列の乗算を並列化した後は、13 秒まで遅くなります。しかし、同じ次元の行列乗算のみをテストしたところ、速度が向上しました。(私は 100x100 行列について話しています。)
最後に、アルゴリズム内の並列化をオフにし、反復ごとに次のコードを追加しました。これはまったく何もせず、おそらく長くはかからないはずです。
int j;
#pragma omp parallel for private(j)
for (int i = 0; i < 10; i++)
j = i;
繰り返しになりますが、このコードを使用しない同じアルゴリズムと比較すると、30% 遅くなります。
したがって、メイン アルゴリズム内で openmp を使用して並列化を 500 回呼び出すと、処理が遅くなります。この動作は私には非常に奇妙に見えますが、問題が何か手がかりはありますか?
メイン アルゴリズムは、VS2010、Win32 リリースによってコンパイルされたデスクトップ アプリケーションによって呼び出されます。私は Intel Core i3 (並列化により 4 つのスレッドが作成されます)、64 ビット Windows 7 で作業しています。
プログラムの構造は次のとおりです。
int internal_method(..)
{
...//no openmp here
// the following code does nothing, has nothing to do with the rest of the program and shouldn't take long,
// but somehow adding of this code caused a 3 sec slowdown of the Huge_algorithm()
double sum;
#pragma omp parallel for private(sum)
for (int i = 0; i < 10; i++)
sum = i*i*i / (1.0 + i*i*i*i);
...//no openmp here
}
int Huge_algorithm(..)
{
...//no openmp here
for (int i = 0; i < 500; i++)
{
.....// no openmp
internal_method(..);
......//no openmp
}
...//no openmp here
}
つまり、最後のポイントは、並列コードを 500 回呼び出すだけで (残りのアルゴリズムを省略した場合)、0.01 秒未満しかかからないが、巨大なアルゴリズム内で 500 回呼び出すと、3 秒の遅延が発生することです。アルゴリズム全体。そして、私が理解していないのは、小さな並列部分がアルゴリズムの残りの部分にどのように影響するかということです.