単純な for ループを並列化する最初の OpenMP プログラムを作成しました。デュアル コア マシンでコードを実行したところ、1 スレッドから 2 スレッドに移行すると速度が向上しました。ただし、学校の Linux サーバーで同じコードを実行したところ、速度が向上しませんでした。さまざまなことを試した後、役に立たない printf ステートメントをいくつか削除すると、コードの速度が大幅に向上することに最終的に気付きました。以下は、私が並列化したコードの主要部分です。
#pragma omp parallel for private(i)
for(i = 2; i <= n; i++)
{
printf("useless statement");
prime[i-2] = is_prime(i);
}
printf の実装には、OpenMP が各スレッドで複製しなければならない大きなオーバーヘッドがあると思います。このオーバーヘッドの原因は何ですか? OpenMP がそれを克服できないのはなぜですか?