Ich bin während While-Schleife in 4 Thread, in der Schleife bin ich Auswertung Funktion und inkrementell steigenden Zähler.C++ massive Leistungseinbußen wegen der if-Anweisung
Wenn ich diese Schleife ausführen, wie ich in 4 laufenden Threads sagte, bekomme ich ~ 20 000 000 Bewertungen pro Sekunde.
Wenn ich einige zufällige Mutation für die Sequenz hinzufügen, bekomme ich ~ 13 000 000 Bewertungen pro Sekunde.
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();
}
Aber wenn ich einfach hinzufügen, wenn Anweisung, die prüft, ob neue Fitness kleiner als alte Fitness ist, wenn das wahr ist, dann alte Fitness mit neuer Fitness ersetzen.
Aber Leistungsverlust ist massiv! Jetzt bekomme ich ~ 20 000 Bewertungen pro Sekunde. Wenn ich zufällige Mutationen entferne, bekomme ich auch ~ 20 000 Bewertungen pro Sekunde.
Variable overallFitness deklariert als
extern int overallFitness;
ich Probleme habe, herauszufinden, was das Problem für einen so großen Performance-Verlust ist. Vergleicht man zwei solche Zeitnahmeoperationen?
Auch glaube ich nicht, dass das Mutex-Verriegelung betrifft.
UPDATE
Dieser Leistungsverlust war nicht wegen der Verzweigungsvorhersage, sondern Compiler nur int fitness = EnergyFunction::evaluate(sequence);
diesen Aufruf ignoriert.
Jetzt habe ich volatile
hinzugefügt und Compiler ignoriert den Anruf nicht mehr.
Auch danke für das Hinweis auf Zweig Fehlvorhersage und atomic<int>
, wusste nicht über sie!
Wegen der Atom ich auch Mutex Teil entfernen, so dass der endgültige Code wie folgt aussieht:
while(1) {
sequence[distDim(mt)] = lookup_Table[dist(mt)];
fitness = EnergyFunction::evaluate(sequence);
if(fitness < overallFitness)
overallFitness = fitness;
++overallGeneration;
}
Jetzt erhalte ich ~ 25 000 Bewertungen pro Sekunde.
Ein möglicher Grund [ist die Falschvorhersage] (http://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array) –
@R_Kapp Nah Das ist nicht verwandt. Das hier ist einfach Sperrkonkurrenz. –
'atomic' kann helfen. –
Jarod42