1

OpenMP を使用して誤った共有が発生していると思います。それを特定して修正する方法はありますか?

私のコードは次のとおりです: https://github.com/wchan/libNN/blob/master/ResilientBackpropagation.hpp 36 行目。

シングル スレッドの 1 コア バージョンと比較して 4 コア CPU を使用しても、追加のパフォーマンスは 10% しか得られませんでした。NUMA 32 物理 (64 仮想) CPU システムを使用している場合、CPU 使用率は約 1.5 コアでスタックします。これは、フォールス シェアリングの直接的な症状であり、スケーリングできないと思います。

また、Intel VTune プロファイラーで実行してみましたが、ほとんどの時間が "f()" および "+=" 関数に費やされていることがわかりました。私はこれが合理的であり、なぜ私がこんなに貧弱なスケーリングを得ているのかを本当に説明していないと信じています...

アイデア/提案はありますか?

ありがとう。

4

2 に答える 2

2

スレッド ID に基づいて配列に明示的にインデックスを付ける代わりに、リダクションを使用します。その配列は事実上、偽の共有を保証します。

つまり、これを置き換えます

#pragma omp parallel for 
    clones[omp_get_thread_num()]->mse() += norm_2(dedy);

for (int i = 0; i < omp_get_max_threads(); i++) {
     neural_network->mse() += clones[i]->mse();

これとともに:

#pragma omp parallel for reduction(+ : mse)
     mse += norm_2(dedy);

neural_network->mse() = mse;
于 2012-01-27T00:54:13.293 に答える
1

確実に知る方法の 1 つは、 cachegrind などのツールを使用してキャッシュ統計を調べることです。

valgrind --tool=cachegrind [command]
于 2012-01-27T15:02:28.173 に答える