2014-02-26 2 views
17

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

+1

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

+1

Möglicherweise relevant: -Ofast ermöglicht Optimierungen, die nach dem C++ - Standard nicht gültig sind. –

+0

@ 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

Antwort

0

Es hat ein großes Interesse an gewesen, warum die Sortiermethode hatte so einen Leistungsabfall.

Ich bin mehr daran interessiert, warum der restliche Code eine gute Besserung sah, aber Konversation zu helfen, unten ist der einzige Teil meines Codes, die unter schneller waren -std = Gnu ++ 11

Es ist nur die Vergleich eines Double auf einem Vektorobjekten Mitglied.

class TvectorPM { 
public: 
    pthread_mutex_t lock; 
    std::vector<PopulationMember> v; 
    void add(PopulationMember p); 
}; 

void TvectorPM::add(PopulationMember p) { 
    pthread_mutex_lock(&lock); 
    v.push_back(p); 
    pthread_mutex_unlock(&lock); 
} 


class PopulationManager { 
public: 
    TvectorPM populationlist; 
} 


void PopulationManager::sortByScore() { 
    // Have overloaded operator< to make this fast 
    sort(populationlist.v.begin(),populationlist.v.end()); 
} 


class PopulationMember { 
public: 
    bool hasChanged; 
    double score; 

    inline bool operator< (const PopulationMember& rhs) const{ 
     return this->score < rhs.score; 
    } 
+0

Ich denke, der Compiler ist in der Lage, für diese Situation zu verbessern, also wenn ich herausfinden könnte warum, wäre es schön, dies wieder in eine ältere Version von g ++ – joeButler

+0

zu bringen Hast du es mit --std = C++ 11 anstelle von gnu ++ 11 versucht? Es kann helfen, zu lösen, was den Unterschied verursacht. – cshelton

-5

C++11 unterscheidet sich von den alten Versionen in der Anzahl der Aspekte. Viele Verbesserungen wurden auch am ursprünglichen Kern der Sprache vorgenommen.
Außerdem werden einige zusätzliche Funktionen hinzugefügt. Sie können die Webseite this besuchen und sich die Artikel mit dem Tag C++11 ansehen.
Einige der kleineren, noch stark genutzten Funktionen -

1. initializer list for `vectors`<br> 
2. range based `for` loop<br> 
3. the `auto` keyword, for declaring data types, <br> 
4. the 'uniform initialization syntax', in its full glory 

und auch die -std=c++11 Flagge, die verwendet werden muss, um eine der oben genannten Funktionen zu genießen.

Bei den Leistungsproblemen konnte es nur ein Zufall sein. Aber führen Sie die Compilations natürlich mehrmals aus.

+1

-1 das beantwortet die Frage überhaupt nicht – Manu343726

0

Ich glaube, das läuft auf die Funktionen GNU (documentation on GNU Extensions) hinaus.

Diese Erweiterungen können einige Funktionen auf ziemlich vernünftige Weise optimieren und zusätzlichen Overhead für andere bereitstellen, da die Leistung von der Form des Codes abhängt.

Leider kann ich keine Angaben machen.

1

Ich bin nicht sicher, warum die Verwendung von --std = gnu ++ 11 Teile des Codes langsamer machen würde. Ich benutze das nicht persönlich (stattdessen verwende ich --std = C++ 11). Vielleicht verlangsamen die zusätzlichen GNU-Funktionen etwas? Wahrscheinlicher ist, dass die Optimierung die neuen Sprachfunktionen noch nicht eingeholt hat.

Was, warum die Art Teil schneller ist, ich habe eine plausible Erklärung:

Sie bewegen Semantik aktiviert haben. Selbst wenn Sie sie nicht explizit selbst schreiben, werden Ihre Klassen generiert, wenn Ihre Klassen angemessen konstruiert sind. Der "Sortier" -Algorithmus nutzt sie wahrscheinlich aus.

Die Klasse, die Sie oben aufgelistet haben, scheint jedoch nicht viel Speicher zu haben. Es hat jedoch keine "swap" -Methode, also muss die Sortierroutine ohne C++ 11 move-Semantik mehr Arbeit leisten. Sie können sich this question and answers ansehen, um mehr über das Sortieren und Verschieben von Semantiken und Interaktionen mit Compileroptionen zu erfahren.

Verwandte Themen