2

OpenMP を使用してアプリケーションを作成しました。2 つのセクションを作成し、それらに 2 つのオブジェクトを配置しました。それらのそれぞれは、ほぼ 22 ~ 23 秒実行されているメソッドを呼び出します。両方のセクションは独立しています。

を設定するnum_threads(1)と、アプリケーションの実行に 46 秒かかります。2×23=46なので大丈夫です。

を設定するnum_threads(2)と、アプリケーションの実行に 35 秒かかりますが、約 25 秒と予想していました。

前述したように、セクションは独立しています。外部変数を使用しないcm1でください。cm2では、私のアプリが予想よりも 10 秒遅い理由を誰か教えてもらえますか? 低レベルでの同期はありますか?

t1 = clock();
#pragma omp parallel num_threads(2)
{
    #pragma omp sections
    {
        #pragma omp section
        {
            Cam cm1;
            cm1.solveUsingCost();
        }

        #pragma omp section
        {
            Cam cm2;
            cm2.solveUsingTime();
        }
    }
}
t2 = clock();
4

2 に答える 2

2

CPUまたはコアはいくつありますか?たとえば、物理コアが2つしかない場合、そのうちの1つは他のすべてのプログラムとOSも処理する必要があるため、スレッドの1つが遅くなります。

もう1つの可能性は、CPUのL3キャッシュが、一度に1つの計算のデータをL3キャッシュに完全に保存するのに十分であるということです。ただし、並列で2を実行する場合は、2倍の量のメモリが使用されるため、L3キャッシュのメモリの一部をRAMに転送する必要があります(ほとんどのマルチコアCPUはコア間でL3キャッシュを共有することに注意してください)。これにより、計算が大幅に遅くなり、説明されている結果につながる可能性があります。

ただし、これらは推測にすぎません。並列で計算を行う場合、ファクター2の速度ゲインがない理由は他にもたくさんあります。

更新:もちろん、CPUがi5であると言うまで忘れていました。i5およびi7プロセッサには、クロック速度を3.3GHzから3.6GHzに上げる機能と呼ばれるこの「ターボブースト」があります。ただし、これは、ほとんどのコアがアイドル状態にあり(熱的な理由で)、単一のコアがブーストされている場合にのみ実行されます。したがって、2つのコアはより低いクロック速度で動作するため、1つのコアの2倍の速度にはなりません。

于 2012-06-22T20:51:47.300 に答える
0

solveUsingCost()前の回答とコメントへの返信から判断すると、あなたの 2 つの関数とsolveUsingTime()は、メモリを大量に消費するか、少なくともメモリ帯域幅が制限されていると思います。

正確には何を計算していますか?そしてどうやって?メモリアクセスあたりの算術演算の比率は、おおよそどのくらいですか? メモリアクセスはどのようにパターン化されていますか? たとえば、大きな配列を数回実行していますか?

于 2012-06-23T17:43:52.940 に答える