以下のサンプル コードは、作業コードの簡易版です。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を使用しています)