Les compilateurs Intel sont-ils vraiment meilleurs que ceux de Microsoft? [fermé]

56

Il y a des années, j'ai été surpris d'apprendre que Intel vend des compilateurs compatibles Visual Studio. Je l'ai essayé en particulier pour le C / C ++ ainsi que pour les outils de diagnostic fantastiques. Mais le code n’était tout simplement pas aussi intensif en calculs pour remarquer la différence. La seule impression était: Intel a-t-il vraiment fait cela pour moi tout à l'heure, wow, des outils étonnants avec une résolution en nanosecondes, incroyable. Mais le procès s'est terminé et l'équipe n'a jamais sérieusement envisagé un achat.

D'après votre expérience, si le coût de la licence n'a pas d'importance, quel fournisseur est le gagnant?

Ce n’est pas une question large ou vague ni une tentative de déclencher une guerre sainte. Ce type de question concerne deux outils très visibles. Personne n'aime quand les outils ont des mystères ou des surprises. Et les choix entre le meilleur et le meilleur sont toujours la douleur. Je comprends aussi que l'herbe est toujours un argument plus vert . Je veux entendre toutes les histoires "Et si".

Et si Intel l’optimisait juste localement pour l’avancement de la puce du mois et que tous les matériels cibles ne fonctionneraient pas aussi bien que ceux compilés par Microsoft? Et si le matériel AMD était la cible et que tout ralentirait sans raison? Ou, d'autre part, si le matériel d'Intel présente tant d'opportunités insoupçonnées que les auteurs de compilateurs Microsoft sont trop lents à adopter et ne les mettent jamais en œuvre dans le compilateur? Que se passe-t-il si les deux sont exactement identiques, en réalité une seule base de code simplement emballée dans deux boîtes différentes et concédée sous licence aux deux fournisseurs par un magasin tiers?

Etc. Mais quelqu'un connaît certaines réponses.

Peter Mortensen
la source
17
Les compilateurs Intel ont la réputation de produire du code numérique très efficace.
quant_dev
2
@honk: Si quant_dev peut fournir des liens pour sauvegarder cela, alors oui, ça devrait l'être!
FrustratedWithFormsDesigner
2
@ RocketSurgeon: Tout le monde n'est pas d'accord avec votre affirmation. En fait, Eric Raymond plaide de manière assez convaincante pour que Microsoft ait retardé de quelques décennies les progrès de l’informatique dans leurs pratiques commerciales.
Mason Wheeler
2
@RocketSurgeon Open Source n'a rien à voir avec de l'argent.
kaoD
1
Le compilateur Microsoft génère un très bon code. L'inspection manuelle de l'assemblage trouve rarement des séquences d'instructions idiotes. En fait, j'ai été impressionné par la profondeur des optimisations. Cela empêche même les instructions de dépasser les limites des lignes de cache.
Doug65536

Réponses:

57

AVERTISSEMENT: réponse basée sur votre propre expérience - YMMV

Si le code est vraiment coûteux en informatique, oui, certainement . J'ai constaté une amélioration de plus de 20 fois avec l'ancien compilateur Intel C ++ (désormais Intel Studio si je me souviens bien) par rapport au compilateur standard Microsoft Visual C ++. Il est vrai que le code était très loin d’être parfait et que cela a peut-être joué un rôle (c’est pourquoi nous avons pris la peine d’utiliser le compilateur Intel, c’était plus simple que de refactoriser la base de code géante), et le processeur utilisé pour exécuter le code était un processeur Intel Core 2. Quad, le processeur idéal pour une telle chose, mais les résultats ont été choquants. Le compilateur lui-même contient une myriade de façons d'optimiser le code, notamment en ciblant un processeur spécifique en termes de capacités SSE , par exemple. Il fait vraiment -O2/ -O3s'enfuir honte. Et c'étaitavant d' utiliser le profileur.

Notez cependant que, si vous activez des optimisations très agressives, la compilation prendra un certain temps. Deux heures pour un projet volumineux n'est pas impossible du tout. De plus, avec des niveaux d'optimisation élevés, il y a plus de chance qu'une erreur dans le code se manifeste (ceci peut être observé avec gcc -O3également). Pour un projet que vous connaissez bien, cela pourrait être un avantage, car vous trouverez et corrigerez tout bogue éventuel que vous n'auriez pas détecté auparavant, mais lorsque vous compilez un désordre poilu, il vous suffit de vous croiser les doigts et de prier les dieux x86.

Quelque chose à propos des performances sur les machines AMD: ce n'est pas aussi bon que les processeurs Intel, mais c'est quand même bien meilleur que le compilateur MS C ++ (encore une fois, d'après mon expérience). La raison en est que vous pouvez également cibler une CPU générique avec le support SSE2 (par exemple). Dans ce cas, les processeurs AMD avec SSE2 ne seront plus très discriminés. Le compilateur Intel sur le processeur Intel vole vraiment la vedette, cependant. Ce ne sont cependant pas tous des arcs-en-ciel doubles et des licornes brillantes. De lourdes accusations ont été portées contre des binaires ne fonctionnant pas du tout sur des processeurs non GenuineIntel et (celui-ci étant admis) induisant artificiellement des performances inférieures sur les processeurs d'autres fournisseurs.. Notez également que ces informations datent d’au moins 3 ans et que leur validité n’est pas connue pour le moment, MAIS les nouvelles descriptions de produits donnent aux cartes binaires une carte blanche pour fonctionner aussi lentement que le souhaite Intel sur des processeurs non-Intel.

Je ne sais pas de quoi il s'agit chez Intel et pourquoi ils font de si bons outils de calcul numérique, mais jetez un œil à cela aussi: http://julialang.org/ . Il y a une comparaison et si vous regardez la dernière ligne, MATLAB brille en battant à la fois le code C et Julia , ce qui me frappe, c'est que les auteurs pensent que la raison en est la bibliothèque Math Kernel d' Intel .

Je réalise que cela ressemble beaucoup à une publicité pour le kit d'outils Intel Compiler, mais d'après mon expérience, cela a vraiment bien fonctionné, et même la simple logique veut que les fabricants de processeurs sachent le mieux le programmer. IMO, le compilateur Intel C ++ compresse chaque gain de performance possible.

K.Steff
la source
@ K.Steff Avez-vous comparé ce compilateur vs ms avec l'optimisation du programme entier et guidée par le profil.
Reprise le
2
Intel a été obligé de révéler que son compilateur utilise délibérément des chemins de code non optimisés au moment de l'exécution si le processeur n'est pas fabriqué par Intel. Intel a eu des ennuis avec la FTC . Vous ne pouviez pas me payer pour utiliser ICC. Je ne toucherais pas cette merde anticoncurrentielle avec un poteau de 10 pieds.
Doug65536
@ doug65536 La question qui se pose est la suivante: "Les compilateurs Intel sont-ils vraiment meilleurs" et non pas "Intel est-il un monopole sur le marché du matériel qui abuse de ce monopole pour gagner plus de terrain en logiciels". Je ne dis pas que votre commentaire est hors sujet, mais pour moi, l'idéologie n'a pas sa place dans cette discussion. Utilisez ou pas - votre appel, mais cela ne changera pas le fait qu'ICC est assez bon pour produire des fichiers binaires pour les processeurs Intel.
K.Steff
Le langage C, qui est devenu populaire dans les années 90, l'a étendu de nombreuses façons, permettant ainsi aux programmeurs d'écrire du code plus efficace, mais que certains compilateurs d'optimisation ne prennent pas en charge. D'après ce que je peux dire, Microsoft est moins enclin que d'autres éditeurs à rechercher des optimisations incompatibles avec de telles extensions. Cela rend leurs compilateurs moins efficaces que ceux qui ne se soucient pas de cette compatibilité lors du traitement de code qui n'en a pas besoin, mais lui permet de traiter correctement le code qui en a besoin.
Supercat
35

Intel Compiler a la réputation de produire du code numérique très efficace:

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/

S'il vous plaît noter que je ne prétends pas que c'est le compilateur le plus rapide là - bas, mais il jouit certainement d' une très bonne réputation pour l' efficacité. Notez que les auteurs des fichiers binaires "officiels" de LAPACK pour Windows utilisent le compilateur Intel Fortran pour les construire: http://icl.cs.utk.edu/lapack-for-windows/ et qu'ils devraient en savoir plus sur l'efficacité.

quant_dev
la source
2
Non seulement il a cette réputation, mais il en est à la hauteur. Ce n'est pas nécessaire si vous l'utilisez pour écrire des applications CRUD, mais les produits C, C ++ et FORTRAN ne permettent absolument pas de traiter efficacement les chiffres.
Blrfl
27

Intel C ++ présente quelques avantages sur gcc en plus du générateur de code. Ces deux facteurs découlent (en grande partie) du fait qu’il s’appuie sur le serveur EDG . Pour le meilleur ou pour le pire, ces deux éléments s'érodent (lentement), de sorte que les avantages ne sont plus aussi importants qu'ils l'étaient auparavant.

La première est qu’il génère généralement de meilleurs messages d’erreur. Vous voudrez peut-être comparer les messages d'erreur entre Clang et gcc. Intel C ++ (avec la plupart des autres systèmes basés sur le système EDG front-end) publie des diagnostics similaires à ceux de Clang depuis des années.

Deuxièmement, le frontal EDG est à peu près aussi connu pour sa conformité linguistique exceptionnelle que le générateur de code Intel pour sa capacité à produire du code rapide. Selon presque toutes les mesures raisonnables, le serveur EDG offre une meilleure conformité avec C ++ 98, 03 ou (dans les versions actuelles) C ++ 0x que tout autre compilateur disponible.

Comme je l'ai dit, ces deux avantages se sont érodés à des degrés divers au fil du temps. Les versions récentes de gcc ont une conformité linguistique assez décente. Clang génère des messages d'erreur nettement meilleurs et progresse également dans la mise en œuvre de l'ensemble du langage C ++. En définitive, Intel C ++ est toujours meilleur que l’un ou l’autre, et c’est un paquet unique qui fait la plupart des choses bien au lieu de nécessiter un compilateur pour de bons diagnostics et un autre pour une meilleure conformité et génération de code.

Jerry Coffin
la source
14

Nous avons essayé cela au travail il y a quelque temps. La plupart de notre base de code est en Delphi, mais nous disposons de fonctionnalités très gourmandes en ressources informatiques que quelqu'un aurait pensé être une bonne idée de faire dans une DLL C ++ à l'époque. Et l'un de mes collègues avait entendu parler du compilateur Intel, alors il décida de l'essayer. Nous avons reconstruit la DLL dans le compilateur Intel et effectué des tests de vitesse. Les résultats l'ont tellement surpris qu'il a pensé qu'il devait faire quelque chose de mal.

La DLL doit calculer des problèmes très difficiles avec des composants de combinatoire et de topologie, qui sont techniquement dans la classe de difficulté NP-difficile si nous les faisons "correctement", mais nous utilisons diverses méthodes heuristiques pour éviter les performances de NP. Malgré cela, il y a beaucoup de calculs en cours. Et pour les tests que nous avons effectués, la différence entre le compilateur VS et le compilateur Intel était soit dans epsilon, soit dans le compilateur Intel, elle était sensiblement plus lente, généralement autour de 20%. Et il en est resté ainsi quelles que soient les modifications apportées aux paramètres de compilation pour que le compilateur Intel produise un code plus rapide. Nous avons donc fini par ne pas y basculer.

Ce n’est bien sûr qu’un exemple concret. Votre kilométrage peut varier.

Maçon Wheeler
la source
Souhaitez-vous partager les détails de la CPU sur laquelle les tests ont été effectués?
Oak
22
Quand je lis votre premier paragraphe, je pensais que vous disiez que les résultats des tests de vitesse lui a surpris une bonne façon. Apparemment, c'est faux, après avoir lu le deuxième paragraphe. Je ne sais pas ce qui m'a induit en erreur en première lecture; à y regarder de plus près, vous n'utilisez en réalité aucun mot positif qui aurait pu me laisser avec cette perception. Je pensais juste que je ferais un commentaire au cas où quelqu'un d'autre ferait la même erreur et ne comprendrait pas ce que vous dites réellement ici.
Cody Gray
2
Avez-vous utilisé un processeur AMD pour les tests? Je pense que ce sont des informations pertinentes (que le compilateur ait délibérément mal fonctionné ou qu'il ne puisse rien faire même quand il faisait de son mieux).
Rétablir Monica
3
C'est un processeur Intel Core i7.
Mason Wheeler
Version courte: Intel était plus lent que VS2010. J'ai aussi essayé cela au travail il n'y a pas si longtemps, sur une base de code contenant des données assez succinctes qui traitent en C ++. J'ai essayé beaucoup de réglages différents. Certains algorithmes individuels avec des tests de performance déjà existants ont été sensiblement plus rapides, mais plus lents. Globalement, toutes les opérations de haut niveau que j'ai effectuées avec le logiciel étaient toujours plus lentes et mesurables. J'ai également essayé cela avec les versions 2013 et 2010 du compilateur d'Intel, 2010 semble être un meilleur code pour les produits ainsi qu'une plus grande stabilité. La plupart de mes tests ont été effectués sur une version antérieure à AVX i7, mais certains sur une version plus ancienne de Core2.
Rich
9

Dans une application embarquée sur laquelle j'ai déjà travaillé, un essai d'un compilateur Intel a montré que cela nous éviterait de faire tourner de nouveaux matériels avec des performances supérieures. Le coût du nouveau matériel était d'environ 10 dollars par unité, les ventes prévues d'un million d'unités, le coût de développement ajouté et les retards du projet. L'option 2 était un profil / micro d'optimiser une base de code déjà raisonnablement bien profilée / optimisée - résultats inconnus, durée inconnue.

Que pensez-vous que le patron a dit quand nous avons demandé des fonds pour acheter le compilateur .......

Cependant, il s’agissait d’un cas très chanceux et plus rare, la sortie de code 10% plus rapide du compilateur Intel nous a poussés à revenir du côté des performances. Si nous étions déjà du bon côté ou si nous avions dépassé 10%, cela n'aurait pas fait de différence. Si nous avions eu les ingénieurs, nous aurions probablement pu optimiser le code et économiser du matériel sans avoir besoin du compilateur Intel, mais le risque était élevé et le compilateur Intel s’est avéré moins coûteux que le temps d’ingénierie.

Dans l’ensemble, je dirais que c’est une forme d’optimisation micro - ne le faites pas avant de savoir que vous en avez besoin, et seulement après que vous ayez établi le profil et trouvé la cause réelle des problèmes. C’est un choix particulièrement judicieux de votre profil qui montre que vous êtes lent "partout" et que vous n’avez pas de goulot de bouteille identifié.

Mattnz
la source
5

Je n'ai rencontré que trois avantages:

  1. Il prend en charge les fonctionnalités des nouveaux processeurs Intel beaucoup plus tôt que les autres compilateurs.

  2. C'est un excellent compilateur supplémentaire pour émettre des avertissements et résoudre les problèmes qui manquent aux autres compilateurs. GCC attrape certaines choses que ICC ne fait pas, et vice versa. Visual studio attrape certaines choses que ICC ne fait pas, et vice versa.

  3. Il effectue beaucoup mieux le travail de boucles à parallélisation automatique (les distribuant automatiquement sur plusieurs threads) que n’importe quel autre compilateur. Cela n'apporte pas grand-chose au code, mais lorsque vous en avez, le code peut faire une énorme différence.

David Schwartz
la source
3

Nous utilisons le compilateur intel pour chaque projet critique de performances de notre base de code. L'avantage, c'est que l'optimisation du code est vraiment maintenable. Au lieu d’ajouter manuellement des appels __mm partout et de demander au compilateur de pré-télécharger des données, qui seront toutes sous-optimales dans la prochaine version, il vous suffit de réorganiser votre code et d’obtenir une accélération insensée.

Souvent, le code optimisé est plus facile à suivre que l’optimisé à la main, il est plus rapide que l’optimisé à la main, et lorsqu’un nouveau jeu d’instructions est publié, le compilateur utilise ce jeu d’instructions. C'est fantastique.

Il en va de même pour le compilateur arm (arm, et non intel), si vous relâchez arm fait un excellent travail de vectorisation pour vous.

martiert
la source
+1 Intel a un compilateur ARM? Incroyable!
1
Non, Intel n'a pas de compilateur ARM. ARM a cependant un compilateur ARM, qui fait un travail fantastique.
martiert
2
"EDIT: bras n’a pas de compilateur bras." est-ce vraiment ce que vous vouliez dire?
luiscubal
0

Vérifiez cette page de référence. En bref, Intel gagne.

Mais la marge peut ne pas être aussi grande: si vous compilez en 32 bits et que votre système de construction ne peut pas supporter l'optimisation guidée par profil, le gain est de l'ordre de 10%. Une telle amélioration en vaut-elle la peine et les temps de compilation plus longs?

JDV-Jan de Vaan
la source
Le lien URL semble être mort.
Contango
0

Il a été dit qu'Intel avait publié le compilateur Intel C ++ v13.0 pour Android, sa première tentative de fournir un compilateur C / C ++ optimisé conçu spécifiquement pour la plate-forme mobile de Google.

Les développeurs peuvent utiliser le compilateur sur des systèmes Linux * pour créer des applications pour périphériques Android basées sur des processeurs Intel, y compris le processeur Intel® Atom ™. Le compilateur Intel est compatible avec GNU C ++ et les outils de développement du kit de développement natif Android (NDK). Vous ne pouvez pas non plus utiliser le compilateur sur n'importe quelle machine de développement. Ni Windows ni OS X n'est pris en charge. les outils sont uniquement certifiés pour une utilisation avec Ubuntu 10.04 ou 11.04

La version actuelle du NDK Android utilise par défaut la version 4.6 de la chaîne d'outils open source Gnu Compiler Collection (GCC). Mais les compilateurs d'Intel incluent de nombreuses optimisations propriétaires pour ses propres puces et peuvent souvent produire un code exécutable plus performant que celui produit par des compilateurs tiers tels que GCC.

LOG_TAG
la source