it-swarm.com.de

Sind Intel-Compiler wirklich besser als die von Microsoft?

Vor Jahren war ich überrascht, als ich entdeckte, dass Intel Visual Studio-kompatible Compiler verkauft. Ich habe es insbesondere für C/C++ sowie fantastische Diagnosetools ausprobiert. Aber der Code war einfach nicht so rechenintensiv, um den Unterschied zu bemerken. Der einzige Eindruck war: Hat Intel es gerade wirklich für mich getan, wow, erstaunliche Tools mit einer Auflösung von Nanosekunden, unglaublich. Aber der Prozess endete und das Team dachte nie ernsthaft über einen Kauf nach.

Wenn die Lizenzkosten keine Rolle spielen, welcher Anbieter ist Ihrer Erfahrung nach der Gewinner?

Es ist keine breite oder vage Frage oder ein Versuch, spark einen heiligen Krieg. Diese Art von Frage handelt von zwei sehr sichtbaren Werkzeugen. Niemand mag es, wenn Werkzeuge irgendwelche Geheimnisse oder Überraschungen haben. Und die Wahl zwischen dem Besten und dem Besten ist immer der Schmerz. Ich verstehe auch das Gras ist immer grüner Argument. Ich möchte alle "Was wäre wenn" -Geschichten hören.

Was ist, wenn Intel es nur lokal für das Chip-Stepping des Monats optimiert und nicht jedes Hardware-Ziel tatsächlich so gut funktioniert wie Microsoft? Was ist, wenn AMD-Hardware das Ziel ist und alles ohne Grund langsamer wird? Oder was ist, wenn Intels Hardware so viele unmerkliche Möglichkeiten bietet, dass Microsoft-Compiler-Autoren zu langsam sind, um sie zu übernehmen, und sie niemals im Compiler implementieren? Was ist, wenn beide genau gleich sind, tatsächlich eine einzige Codebasis, die nur in zwei verschiedene Boxen eingewickelt und von einem Drittanbieter an beide Anbieter lizenziert wurde ?

Und so weiter. Aber jemand kennt einige Antworten.

56
user7071

WARNUNG: Antwort basierend auf eigener Erfahrung - YMMV

Wenn der Code wirklich rechenintensiv ist, ja, definitiv . Ich habe mit dem früheren Intel C++ Compiler (jetzt Intel Studio, wenn ich mich richtig erinnere) eine Verbesserung von über 20x gegenüber dem Standard-Microsoft Visual C++ - Compiler festgestellt. Es ist wahr, dass der Code alles andere als perfekt war und dass dies möglicherweise eine Rolle gespielt hat (eigentlich haben wir uns deshalb die Mühe gemacht, den Intel-Compiler zu verwenden, es war einfacher als die riesige Codebasis umzugestalten). Auch die CPU, auf der der Code ausgeführt wurde, war ein Intel Core 2 Quad, die perfekte CPU für so etwas, aber die Ergebnisse waren schockierend. Der Compiler selbst enthält unzählige Möglichkeiten zur Optimierung des Codes, einschließlich der Ausrichtung auf eine bestimmte CPU, z. B. SSE Funktionen. Es lässt -O2/-O3 Wirklich beschämt davonlaufen. Und das war vorher mit dem Profiler.

Beachten Sie jedoch, dass das Aktivieren wirklich aggressiver Optimierungen die Kompilierung einige Zeit in Anspruch nimmt. Zwei Stunden für ein großes Projekt sind überhaupt nicht unmöglich. Bei hohen Optimierungsstufen besteht außerdem eine höhere Wahrscheinlichkeit, dass sich ein Fehler im Code manifestiert (dies kann auch bei gcc -O3 Beobachtet werden). Für ein Projekt, das Sie gut kennen, kann dies ein Plus sein, da Sie eventuelle Fehler finden und beheben, die Sie zuvor nicht entdeckt haben. Wenn Sie jedoch ein haariges Durcheinander zusammenstellen, drücken Sie einfach die Daumen und beten zu den x86-Göttern.

Etwas über die Leistung auf AMD-Computern: Es ist nicht so gut wie Intel-CPUs, aber es ist immer noch so besser als der MS C++ - Compiler (wieder aus meiner Erfahrung). Der Grund ist, dass Sie auch auf eine generische CPU mit SSE2 Unterstützung (zum Beispiel) abzielen können. Dann werden AMD-CPUs mit SSE2 nicht stark unterschieden. Der Intel-Compiler auf Intel-CPU stiehlt die Show jedoch wirklich. Es sind jedoch nicht nur doppelte Regenbogen und glänzende Einhörner. Es gab einige schwere Anschuldigungen, dass Binärdateien auf Nicht-GenuineIntel-CPUs überhaupt nicht ausgeführt werden und (dies ist zugegeben) künstlich eine schlechtere Leistung auf CPUs von anderen Anbietern . Beachten Sie auch, dass dies Informationen von vor mindestens 3 Jahren sind und ihre Gültigkeit derzeit nicht bekannt ist, ABER die neuen Produktbeschreibungen geben Binärdateien die Möglichkeit, so langsam zu laufen, wie Intel es für Nicht-Intel-CPUs für richtig hält.

Ich weiß nicht, was es mit Intel auf sich hat und warum sie so gute numerische Berechnungstools herstellen, aber sehen Sie sich das auch an: http://julialang.org/ . Es gibt einen Vergleich und wenn Sie sich die letzte Zeile ansehen, MATLAB leuchtet, indem Sie sowohl C-Code als auch Julia besiegen, was mir auffällt ist, dass die Autoren denken, der Grund sei Intels Math Kernel Library .

Mir ist klar, dass dies sehr nach einer Werbung für das Intel Compiler-Toolkit klingt, aber meiner Erfahrung nach hat es wirklich gute Arbeit geleistet, und selbst einfache Logik schreibt vor, dass die Leute, die CPUs herstellen, am besten wissen sollten, wie man für sie programmiert. IMO, der Intel C++ - Compiler drückt jeden noch möglichen Leistungsgewinn aus.

57
K.Steff

Intel Compiler hat den Ruf, sehr effizienten numerischen Code zu produzieren:

https://stackoverflow.com/questions/1733627/anyone-here-has-benchmarked-intel-c-compiler-and-gcc

http://www.open-mag.com/754088105111.htm

http://www.freewebs.com/godaves/javabench_revisited/

Bitte beachten Sie, dass ich nicht behaupte, dass es der schnellste Compiler auf dem Markt ist, aber es genießt sicherlich einen sehr guten Ruf für Effizienz. Beachten Sie, dass die Autoren "offizieller" LAPACK-Binärdateien für Windows den Intel Fortran-Compiler verwenden, um sie zu erstellen: http://icl.cs.utk.edu/lapack-for-windows/ und sie sollten es wissen ein oder zwei Dinge über Effizienz.

35
quant_dev

Intel C++ bietet neben dem Codegenerator einige Vorteile gegenüber gcc. Beide stammen (größtenteils) aus der Tatsache, dass es auf dem EDG Frontend basiert. Ob gut oder schlecht, beide erodieren (langsam), sodass die Vorteile bei weitem nicht mehr so ​​groß sind wie früher.

Das erste ist, dass es in der Regel viel bessere Fehlermeldungen gibt. Vielleicht möchten Sie sich eine Vergleich von Fehlermeldungen zwischen Clang und gcc ansehen. Intel C++ (zusammen mit den meisten anderen, die auf dem EDG-Frontend basieren) gibt seit Jahren ähnliche Diagnosen wie Clang heraus.

Zweitens ist das EDG-Frontend für seine außergewöhnlich gute Sprachkonformität ungefähr so ​​bekannt wie der Intel-Codegenerator für die Erzeugung von schnellem Code. In nahezu jeder vernünftigen Weise bietet das EDG-Frontend eine bessere Konformität mit C++ 98, 03 oder (in aktuellen Versionen) C++ 0x als jeder andere verfügbare Compiler.

Wie gesagt, diese beiden Vorteile haben sich im Laufe der Zeit in unterschiedlichem Maße verschlechtert. Neuere Versionen von gcc weisen eine recht anständige Sprachkonformität auf. Clang hat wesentlich bessere Fehlermeldungen und macht gute Fortschritte bei der Implementierung der gesamten C++ - Sprache. Wenn man es genau betrachtet, ist Intel C++ in beiden Punkten immer noch besser als eines von beiden, und es ist ein einziges Paket, das die meisten Dinge richtig macht, anstatt einen Compiler für eine gute Diagnose und einen anderen für eine bessere Konformität und Codegenerierung zu benötigen.

27
Jerry Coffin

Wir haben das vor einiger Zeit bei der Arbeit versucht. Der größte Teil unserer Codebasis befindet sich in Delphi, aber wir haben einige sehr rechenintensive Funktionen, die jemand in einer C++ DLL vor langer Zeit) für eine gute Idee gehalten hätte. Und eine meiner Mitarbeiter hatten großartige Dinge über den Intel-Compiler gehört und beschlossen, ihn auszuprobieren. Wir haben die DLL im Intel-Compiler neu erstellt und einige Geschwindigkeitstests durchgeführt, und die Ergebnisse überraschten ihn so sehr, dass er Ich dachte, er muss etwas falsch machen.

Die DLL muss einige sehr schwierige Probleme mit Kombinatorik- und Topologiekomponenten berechnen, die technisch in der NP-Schwierigkeitsklasse liegen, wenn wir sie "richtig" gemacht haben, aber wir verwenden verschiedene Heuristiken, um = zu vermeiden NP Leistung. Trotzdem gibt es eine Menge Zahlenverarbeitung. Und für die Tests, die wir durchgeführt haben, lag der Unterschied zwischen dem VS-Compiler und dem Intel-Compiler entweder innerhalb von epsilon oder innerhalb des Intel-Compilers merklich langsamer, im Allgemeinen um ungefähr 20%. Und es blieb so, egal welche Änderungen er an den Kompilierungseinstellungen vorgenommen hatte, um zu versuchen, den Intel-Compiler dazu zu bringen, schnelleren Code zu produzieren. Also wechselten wir nicht dazu.

Dies ist natürlich nur ein Beispiel aus der Praxis. Ihr Kilometerstand kann variieren.

14
Mason Wheeler

In einer eingebetteten Anwendung, an der ich einmal gearbeitet habe, hat eine Testversion eines Intel-Compilers gezeigt, dass wir keine neue Hardware mit höherer Leistung drehen müssen. Die Kosten für die neue Hardware betrugen rund 10 USD/Einheit, ein prognostizierter Umsatz von 1 Million Einheiten, zusätzliche Entwicklungskosten und Projektverzögerungen. Option 2 war eine Profil-/Mikrooptimierung einer bereits einigermaßen gut profilierten/optimierten Codebasis - unbekannte Ergebnisse, unbekannte Zeit.

Was hat der Chef wohl gesagt, als wir um das Geld für den Kauf des Compilers gebeten haben?.

Die 10% schnellere Code-Ausgabe des Intel-Compilers hat uns jedoch - dies war ein sehr glücklicher und seltener Edge-Fall - wieder auf die richtige Seite der Leistung gebracht. Wenn wir schon auf der rechten Seite wären oder 10% mehr wären, hätte das keinen Unterschied gemacht. Hätten wir die Ingenieure gehabt, hätten wir wahrscheinlich den Code optimieren und den Hardware-Spin sparen können und den Intel-Compiler nicht benötigt. Das Risiko war jedoch hoch und der Intel-Compiler war billiger als die Engineering-Zeit.

Alles in allem würde ich sagen, dass es sich um eine Form der Mikrooptimierung handelt - tun Sie dies erst, wenn Sie wissen, dass Sie dies tun müssen, und dann erst, nachdem Sie das Profil erstellt und die tatsächliche Ursache der Probleme gefunden haben. Es ist eine besonders gute Wahl für Ihr Profil, das zeigt, dass Sie "überall" langsam sind und keine identifizierten Engpässe haben.

9
mattnz

Ich habe nur drei Vorteile festgestellt:

  1. Es unterstützt Funktionen neuerer Intel-CPUs viel früher als andere Compiler.

  2. Es ist ein großartiger zusätzlicher Compiler, um Warnungen auszugeben und Probleme zu erkennen, die andere Compiler übersehen. GCC fängt einige Dinge auf, die ICC nicht tut, und umgekehrt. Visual Studio fängt einige Dinge ein, die ICC nicht tut, und umgekehrt.

  3. Die automatische Parallelisierung von Schleifen (automatische Verteilung auf mehrere Threads) ist viel besser als bei jedem anderen Compiler. Davon profitiert nicht sehr viel Code, aber wenn Sie Code haben, der dies tut, kann dies einen großen Unterschied machen.

5
David Schwartz

Wir verwenden den Intel-Compiler für jedes leistungskritische Projekt unserer Codebasis. Das Tolle daran ist, dass die Optimierung des Codes wirklich wartbar ist. Anstatt überall manuell __mm-Aufrufe hinzuzufügen und den Compiler anzuweisen, Daten vorab abzurufen, die in der nächsten Version wieder suboptimal sind, ordnen Sie Ihren Code einfach neu an und erzielen eine verrückte Beschleunigung.

Oft ist der optimierte Code einfacher zu befolgen als der von Hand optimierte, er ist schneller als der von Hand optimierte, und wenn ein neuer Befehlssatz veröffentlicht wird, verwendet der Compiler diesen Befehlssatz. Es ist fantastisch.

Das Gleiche gilt auch für den Arm-Compiler (von Arm, nicht von Intel), wenn Ihre Freigabe auf Arm einen großartigen Job beim Vektorisieren für Sie macht.

3
martiert

Überprüfen Sie diese Benchmark-Seite. Kurz gesagt, Intel gewinnt.

Die Marge ist jedoch möglicherweise nicht so groß: Wenn Sie auf 32 Bit kompilieren und Ihr Build-System die profilgesteuerte Optimierung nicht unterstützt, liegt der Gewinn in der Größenordnung von 10%. Lohnt sich eine solche Verbesserung für die Mühe und die längeren Kompilierungszeiten?

0
jdv-Jan de Vaan

Es wurde gesagt, dass Intel den Intel C++ Compiler v13.0 für Android OS) veröffentlicht hat, seinen ersten Versuch, einen optimierenden C/C++ - Compiler bereitzustellen, der speziell für die mobile Plattform von Google entwickelt wurde.

Entwickler können den Compiler auf Linux * -basierten Systemen verwenden, um Apps für Android Geräte, die auf Intel-Prozessoren basieren, einschließlich des Intel® Atom ™ -Prozessors, zu erstellen. Der Intel-Compiler ist kompatibel mit GNU C++ und Entwicklertools im Android Native Development Kit (NDK)) Sie können den Compiler auch nicht auf jedem Entwicklungscomputer verwenden. Weder Windows noch OS X werden unterstützt. Die Tools sind nur für die Verwendung mit Ubuntu 10.04 oder 11.04 zertifiziert

Die aktuelle Version des Android NDK verwendet standardmäßig Version 4.6 der Open Source Gnu Compiler Collection (GCC) -Toolchain. Intels Compiler enthalten jedoch viele proprietäre Optimierungen für ihre eigenen Chips und können häufig ausgegeben werden ausführbarer Code, der eine bessere Leistung erzielt als Compiler von Drittanbietern wie GCC.

0
LOG_TAG