Ich habe auf einem genetischen Algorithmus arbeiten, die ich vorher kompilieren würde wurde mit g ++ 4.8.1 mit den ArgumentenWas bekannte Performance-Unterschiede gefunden werden, wenn -std = mit Gnu ++ 11
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native -std=gnu++11
I wurde keine vernünftige Profilierungssystem so ersetzt ich buchstäblich 3-4 Zeilen Code viele der Funktionen von C++ 11 und haben mit und hatte kompilieren es ohne ++ -std = Gnu 11
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native
Als ich lief mein Profiler wieder, ich bemerkte, dass ich ~ 5% Leistungsverbesserung fast überall sehen konnte, außer für meine Sortierfunktion, whi ch brauchte jetzt etwa doppelt so lange. (Es ist ein überladener Operator < auf dem Objekt)
Meine Fragen sind:
Welche Performance-Unterschiede zwischen den beiden Versionen bekannt sind, und es wird erwartet, dass C++ 11 schneller in neueren Compiler wäre?
Ich erwarte auch die Tatsache, die ich verwende -Ofast spielt eine Rolle, bin ich richtig in meiner Annahme?
UPDATE:
Wie in den Kommentaren habe ich vorgeschlagen, die Tests wieder lief mit mit und ohne -march = native
// Fast sort, slightly slower in other tests
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native -std=gnu++11
// Fast sort, slower in other tests
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -std=gnu++11
// Slow sort, slower in other tests
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse
// Slow sort, fastest in other tests
CCFLAGS=-c -Wall -Ofast -fopenmp -mfpmath=sse -march=native
Die Schlussfolgerung scheint die gleiche zu sein, dass -std = Gnu ++ 11 beschleunigen sich drastisch mit einer leichten Strafe fast überall sonst. -march = nativ beschleunigt das Programm wann immer es benutzt wird.
Angesichts der Tatsache, dass Sortierung nur einmal pro Generation aufgerufen wird, nehme ich den Geschwindigkeitsvorteil, nicht mit -std = gnu ++ 11 zu kompilieren, aber ich bin immer noch sehr daran interessiert, was diese Ergebnisse verursacht.
ich // std bin mit :: bereitgestellt Art, die aus #include
Wie für die Leistungsverbesserungen: Verschieben Sie Semantik in den Standard-Bibliothek Container und Algorithmen. Es wäre jedoch schön, den Code in der Sortierfunktion zu sehen, die 2x Verlangsamung ist verdächtig. Übrigens: '-std = gnu ++ 11' aktiviert auch GNU-Erweiterungen; Wahrscheinlich willst du '-std = C++ 11 ', was nicht so ist. – Ali
Möglicherweise relevant: -Ofast ermöglicht Optimierungen, die nach dem C++ - Standard nicht gültig sind. –
@ R.MartinhoFernandes Ja, aber es wird in beiden Fällen verwendet, so dass der Unterschied von C++ 11 Features oder einer GNU-Erweiterung kommt. Ohne den tatsächlichen Code zu sehen, können wir jedoch nicht wissen, warum die Sortierung 2x langsamer ist. – Ali