2009-11-14 10 views
26

Ich bin nicht sicher, ob ich diese Frage hier posten sollte, denn das scheint eine programmierungsorientierte Website zu sein.Wer hier hat Benchmark-Intel C++ - Compiler und GCC?

Wie auch immer, ich denke, dass es hier einige Gurus geben muss, die das wissen.

Jetzt habe ich einen AMD Opteron Server mit CentOS 5. Ich möchte einen Compiler für ein ziemlich großes auf C++ Boost basierendes Programm haben. Welchen Compiler sollte ich wählen?

+0

Solange der Compiler mit/fast switch läuft und auf einer Intel-CPU läuft (der Compiler sollte auf einer Intel-CPU laufen, nicht unbedingt das kompilierte Programm), erhalten Sie insgesamt einen effizienteren Code. –

Antwort

18

Ich hoffe, das hilft mehr als weh tut :)

ich eine kleine Compiler Schießerei habe irgendwann vor über ein Jahr, und ich bin Speicher abgehend.

  1. GCC 4.2 (Apple)
  2. Intel 10
  3. GCC 4.2 (Apple) + LLVM

ich mehrere Vorlagen schwere Audiosignalverarbeitungsprogramme getestet, die ich geschrieben hatte.

Kompilierungszeiten: Der Intel-Compiler war bei weitem der langsamste Compiler - mehr als '2x mal langsamer' als ein anderer gepostet zitiert.

GCC behandelt tiefe Vorlagen sehr gut im Vergleich zu Intel.

Der Intel-Compiler generiert riesige Objektdateien.

GCC + LLVM ergab die kleinste binäre.

Der generierte Code kann aufgrund der Konstruktion des Programms erhebliche Abweichungen aufweisen und wo SIMD verwendet werden könnte.

Für die Art, wie ich schreibe, fand ich, dass GCC + LLVM den besten Code generierte. Für Programme, die ich vorher geschrieben hatte, nahm ich Optimierungen ernst (wie ich geschrieben habe), Intel war im Allgemeinen besser.

Die Ergebnisse von Intel variierten; es hat einige Programme viel besser gehandhabt, und einige Programme waren viel schlechter. Es hat die rohe Verarbeitung sehr gut gehandhabt, aber ich gebe GCC + LLVM den Kuchen, weil wenn es in den Kontext eines größeren (normalen) Programms gestellt wurde ... es besser gemacht hat.

Intel gewann für out of the box, Zahlenverarbeitung auf riesigen Datensätzen.

GCC allein generiert den langsamsten Code, obwohl es mit Messungen und Nano-Optimierungen so schnell sein kann. Ich ziehe es vor, diese zu vermeiden, weil der Wind mit dem nächsten Compiler-Release sozusagen die Richtung wechseln könnte.

Ich habe nie schlecht geschriebene Programme in diesem Test gemessen (d. H. Die Ergebnisse übertrafen die Distributionen der populären Leistungsbibliotheken).

Schließlich wurden die Programme über mehrere Jahre geschrieben, mit GCC als der primäre Compiler in dieser Zeit.

Update: Ich habe auch Optimierungen/Erweiterungen für Core2Duo aktiviert. Die Programme waren sauber genug, um ein striktes Aliasing zu ermöglichen.

+0

Können Sie näher erläutern, was Sie mit "für die Art, wie Sie schreiben" meinen? – int3

+3

@ int3 Kurz gesagt, für optimierte Programme, schreibe ich: unglaublich streng/klein, zwingen den Compiler, das Programm zu bewerten, bieten Spezialisierungen/Überladungen, gehen aus dem Weg, um Kompilierungszeit Polymorphismus (vs. Laufzeit) zu erreichen, bieten eine viel Sichtbarkeit für den Compiler, viele Sprachfeatures wie vorgesehen verwenden, Korrektheit, Inlining erzwingen, eine unglaublich lange Warnliste haben. Ich messe und benchmark, keine Inline-Asm.Spezifisch für den Compiler Shootout; Ich höre auf, bevor ich Programme umschreibe, um die Vorteile der Vektorisierung/SIMD-Insns zu nutzen (ein Bereich, in dem sich der Compiler von Intel hervorgetan hat). Ich hoffe das hilft. – justin

24

Es gibt eine interessante PDF here, die eine Reihe von Compilern vergleicht.

+2

Psssstttttt .... Ich war gerade dabei, das zu posten. Es diskutiert wirklich nur die Mikrooptimierung und scheint zu implizieren, dass gcc in den meisten Fällen besser ist als icc. – dmckee

+3

Aye ist ein interessantes Dokument auf dieser Front. Ich wünschte, du könntest Visual Studio Integration für GCC bekommen. Das wären die Nüsse des Mutts ... – Goz

1

Ich arbeitete an einem ziemlich großen Signalverarbeitungssystem, das auf einem großen Cluster lief. Früher haben wir mit schwerem Rechnen gerechnet, der Intel-Compiler hat uns etwa 10% weniger CPU-Last als GCC gebracht. Das ist sehr unwissenschaftlich, aber es war unsere Erfahrung (das war vor etwa 18 Monaten).

Interessant wäre es, wenn wir auch die Mathematikbibliotheken von Intel nutzen könnten, die ihren Chipsatz effizienter nutzen.

14

Das MySQL-Team hat einmal veröffentlicht, dass ICC ihnen einen 10% igen Performance-Schub gegenüber gcc gegeben hat. Ich werde versuchen, den Link zu finden.

Im Allgemeinen habe ich festgestellt, dass die ‚native‘ Compiler besser als gcc auf ihrer jeweiligen Plattform

edit: ich ein wenig weg war. Typische Gewinne waren 20-30% und nicht 10%. Einige Engpässe haben sich verdoppelt. http://www.mysqlperformanceblog.com/files/presentations/LinuxWorld2004-Intel.pdf

5

Wir verwenden den Intel-Compiler für unser Produkt (DB2), für Linux und Windows IA32/AMD64 und für OS X (d. H. Alle unsere Intel-Plattformports außer SunAMD).

Ich weiß nicht, die Zahlen, aber die Leistung ist gut genug, dass wir:

  • Lohn für den Compiler, den ich gesagt sehr teuer ist.
  • leben mit den zweimal langsameren Build-Zeiten (in erster Linie aufgrund der Zeit, die es dauert, Lizenzen zu erwerben, bevor es sich ausführen lässt).
6

Ich nehme an, es variiert je nach Code, aber mit der Code-Basis arbeite ich jetzt an, ICC 11,035 gibt eine fast 2x Verbesserung gegenüber gcc 4.4.0 auf einem Xeon 5504.

icc Optionen: -O2 -fno-alias
gcc Optionen: -O3 -msse3 -mfpmath=sse -fargument-noalias-global

die Optionen sind spezifisch nur auf die Datei, um die rechenintensiven Code enthält, wo ich weiß, dass es kein Aliasing ist. Single-Thread-Code mit einer 5-Level-Nested-Loop.

Obwohl autovectorization aktiviert ist, erzeugen weder Compiler vektorisiert Code (kein Fehler der Compiler)


Update (2015.02.27): Während einige Geophysik Code (Q2 2013) Optimierung auf Auf Sandy Bridge-E Xeons hatte ich Gelegenheit, die Leistung von ICC 11.1 gegen GCC 4.8.0 zu vergleichen, und GCC erzeugte jetzt einen schnelleren Code als ICC. Der verwendete Code wurde von AVX-Intrinsics verwendet und verwendete 8-Wege-vektorisierte Befehle (der Nieter-Compiler initialisierte den Code aufgrund bestimmter Datenlayoutanforderungen ordnungsgemäß).Darüber hinaus war die LTO-Implementierung von GCC (mit dem in den .o-Dateien eingebetteten IR-Kern) viel einfacher zu verwalten als die in ICC. GCC mit LTO lief rund 3 mal schneller als ICC ohne LTO. Ich bin nicht in der Lage, die Nummern für GCC ohne LTO zu finden, aber ich erinnere mich, dass es immer noch schneller als ICC war. Es ist keineswegs eine allgemeine Aussage zur Leistung des ICC, aber die Ergebnisse waren ausreichend, um mit GCC 4.8. * Weiterzumachen.

Wir freuen uns auf GCC 5.0 (http://www.phoronix.com/scan.php?page=article&item=gcc-50-broadwell)!

+0

Sorry, das hätte -fargument-noalias-global für gcc sein sollen, nicht -fno-alias –

+1

Vielen Dank für das Posten. Nachdem ich Ihren Artikel gelesen habe, habe ich Ihre gcc Optionen ausprobiert. Ich hatte mein Programm mit "-O3" ausprobiert, ohne große Verbesserungen zu bemerken, aber "-O3-msse3" hat mein Programm enorm verbessert! Das Zeug, das ich mache (Audio-DSP) ist ziemlich vektorisierbar, aber ich habe den generierten Code noch nicht angeschaut. Aber mein Programm besteht seine Testsuite und macht es in weniger als 2/3 der Zeit, die es zuvor getan hat! – steveha

+0

@steveha Cool! Versuchen Sie außerdem, -fargument-noalias-global zu verwenden, wenn Sie wissen, dass im Code kein Aliasing vorhanden ist, oder beschränken Sie Ihre Zeiger selektiv mit dem Schlüsselwort restrict. Dies gibt dem Compiler viel mehr Flexibilität beim Neuordnen von Befehlen. Ich habe einen großen Leistungsschub bekommen, als ich Videocode für einen TI DSP optimiert habe. –

1

I verwendet UnixBench (v 5.1.3.) auf einem openSUSE 12.2 (kernel 3.4.33-2.24 x86_64-default), und es zunächst mit GCC kompiliert und dann mit Intels Compiler.

Mit einer parallelen Kopie ist UnixBench, kompiliert mit Intel, ungefähr 20% schneller als die mit GCC kompilierte Version. Aber das birgt große Unterschiede. Dhrystone ist mit Intel Compiler um 25% langsamer, während Whetstone 2x schneller läuft.

Mit 4 parallel laufenden Versionen von UnixBench beträgt die Verbesserung des Intel-Compilers gegenüber GCC nur 7%. Wieder ist Intel viel besser bei Whetstone (> 200%) und langsamer bei Dhrystone (ca. 20%).

0

Viele Optimierungen, die der Intel-Compiler routinemäßig ausführt, erfordern eine bestimmte Quellsyntax und die Verwendung von -O3 -ffast-math für gcc. Leider hat sich die Komponente -funssafe-math-optimization -ffast-math -O3 -march = nativ als nicht kompatibel mit -fopenmp erwiesen. Daher muss ich meine Quelldateien in Gruppen aufteilen, die mit den verschiedenen Optionen in Makefile benannt sind. Heute habe ich einen Fehler gefunden, bei dem ein g ++ - Build mit -O3 -ffst-math -fopenmp -march = nativ in der Lage war, auf den Bildschirm zu schreiben, aber nicht in eine Datei umzuleiten. Einer der größeren Unterschiede meiner Meinung nach ist die Optimierung durch iccp nur von std :: max und min, wobei gcc/g ++ wollen, dass fmax | min [f] mit -ffast-math ihre Bedeutung vom Standard abweicht.