1

以下のサンプル コードは、作業コードの簡易版です。std::vector::push_backこのコードでは、共有変数への書き込みは、が呼び出される最後の行でのみ行われます。

std::vector<struct FortyByteStruct> results;

#pragma omp parallel for num_threads(8)
for (int i = 0; i < 250; i++)
{
    struct FortyByteStruct result = some_heavy_work(i);

    #pragma omp critical
    {
        results.push_back(result);
    }
}

この操作が誤った共有につながるのではないかと思ってpush_backいたので、それを取り除くことでさらに最適化する機会が得られました. この問題を掘り下げる前に、まずいくつかのベンチ テストを行うことにしました。

ではchrono、ウォール クロックの実行時間some_heavy_work()とクリティカル セクションを別々に測定しました。後者は前者の約10^(-4)倍の実行時間を要したので、false-sharing の有無にかかわらず、この部分を最適化してもほとんどメリットがないと判断しました。

とにかく、ここで偽の共有が問題になるかどうか、私はまだ興味があります. の内部実装を見る必要がありstd::vectorますか? どんな啓発も大歓迎です。(私はVS2015を使用しています)

4

2 に答える 2