私はループ中に4スレッドのループを実行していますが、ループ内で関数を評価してカウンタを増分しています。if文によるC++の大規模なパフォーマンスの低下
while(1) {
int fitness = EnergyFunction::evaluate(sequence);
mutex.lock();
counter++;
mutex.unlock();
}
私はこのループを実行すると、私は4つの実行中のスレッドに言ったように、私は毎秒〜20 000 000評価を取得します。
while(1) {
if (dist(mt) == 0) {
sequence[distDim(mt)] = -1;
} else {
sequence[distDim(mt)] = 1;
}
int fitness = EnergyFunction::evaluate(sequence);
mainMTX.lock();
overallGeneration++;
mainMTX.unlock();
}
シーケンスにランダムな突然変異を追加すると、1秒あたり〜13,000,000回の評価が発生します。
while(1) {
if (dist(mt) == 0) {
sequence[distDim(mt)] = -1;
} else {
sequence[distDim(mt)] = 1;
}
int fitness = EnergyFunction::evaluate(sequence);
mainMTX.lock();
if(fitness < overallFitness)
overallFitness = fitness;
overallGeneration++;
mainMTX.unlock();
}
しかし、それは、新しいフィットネスと古いフィットネスを置き換える真であれば、新たなフィットネスが古いフィットネスよりも小さい場合には、ステートメントをチェックしている場合、私はシンプル追加。
しかし、パフォーマンスの損失は巨大です!今は毎秒20,000件の評価があります。ランダム突然変異部分を削除した場合、1秒あたり〜20,000回の評価も得られます。私は、このような大きなパフォーマンス損失の問題が何であるかを考え出すトラブルを抱えています
extern int overallFitness;
として
変数overallFitnessが宣言されています。このような時間を2つのintと比較していますか?
また、私はそれがミューテックスロックに関係しているとは思いません。
UPDATE
このパフォーマンスの損失があるため、分岐予測のではなかったが、コンパイラは、単にこの呼び出しint fitness = EnergyFunction::evaluate(sequence);
を無視していました。
volatile
およびコンパイラを追加しました。
はまたそれらについて知らなかった、分岐予測ミスとatomic<int>
を指摘ありがとうございました!
私はまた、ミューテックスの一部を除去するので、最終的なコードは次のようになり、原子のため、次
while(1) {
sequence[distDim(mt)] = lookup_Table[dist(mt)];
fitness = EnergyFunction::evaluate(sequence);
if(fitness < overallFitness)
overallFitness = fitness;
++overallGeneration;
}
は、今私は毎秒〜25の000評価を得ています。
考えられる理由の1つは、[間違った予測です](http://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array) –
@R_Kapp Nah 、それは無関係です。これは単純にロックの競合です。 –
'atomic'が役に立ちます。 –
Jarod42