Компиляторы Intel действительно лучше, чем Microsoft? [закрыто]

56

Несколько лет назад я был удивлен, когда обнаружил, что Intel продает компиляторы, совместимые с Visual Studio. Я попробовал это, в частности, для C / C ++, а также для фантастических инструментов диагностики. Но код не был настолько сложным в вычислительном отношении, чтобы заметить разницу. Единственное впечатление было: действительно ли Intel действительно сделала это для меня сейчас, вау, потрясающие инструменты с разрешением наносекунд, невероятно. Но испытание закончилось, и команда никогда серьезно не рассматривала покупку.

По вашему опыту, если стоимость лицензии не имеет значения, какой поставщик победит?

Это не широкий или расплывчатый вопрос или попытка разжечь священную войну. Этот вопрос касается двух очень заметных инструментов. Никому не нравится, когда у инструментов есть какие-то загадки или сюрпризы. И выбор между лучшим и лучшим - это всегда боль. Я также понимаю, что трава - это всегда более зеленый аргумент. Я хочу услышать все истории "что, если".

Что, если Intel просто локально оптимизирует его для чип-шагинга месяца, и не каждая аппаратная цель будет работать так же хорошо, как скомпилированная Microsoft? Что, если аппаратное обеспечение AMD является целью, и все замедлится без причины? Или, с другой стороны, что, если у оборудования Intel так много незаметных возможностей, что разработчики компиляторов Microsoft слишком медлительны, чтобы принять его и никогда не внедрять в компилятор? Что, если оба они в точности одинаковы, на самом деле одна кодовая база просто обернута в две разные коробки и лицензирована для обоих поставщиков каким-то сторонним магазином?

И так далее. Но кто-то знает некоторые ответы.

Питер Мортенсен
источник
17
Компиляторы Intel имеют репутацию производителя очень эффективного числового кода.
Quant_Dev
2
@honk: Если quant_dev может предоставить несколько ссылок, подтверждающих это, то да, так и должно быть!
FrustratedWithFormsDesigner
2
@RocketSurgeon: Не все согласятся с вашим утверждением. На самом деле Эрик Рэймонд приводит довольно веские аргументы в пользу того, что Microsoft несколько десятилетий сдерживала прогресс вычислений в своей деловой практике.
Мейсон Уилер
2
@RocketSurgeon с открытым исходным кодом не имеет ничего общего с деньгами.
КаоД
1
Компилятор Microsoft генерирует очень хороший код. Ручной осмотр сборки редко находит какие-либо идиотские последовательности команд. На самом деле, я был впечатлен глубиной оптимизации, которая даже не позволяет инструкциям пересекать границы строк кэша.
doug65536

Ответы:

57

ВНИМАНИЕ: Ответ основан на собственном опыте - YMMV

Если код действительно вычислительно дорог, да, определенно . Я видел улучшение более чем в 20 раз с прежним компилятором Intel C ++ (теперь Intel Studio, если я правильно помню) по сравнению со стандартным компилятором Microsoft Visual C ++. Это правда, что код был очень далек от совершенства, и это, возможно, сыграло свою роль (на самом деле, именно поэтому мы потрудились использовать компилятор Intel, это было проще, чем рефакторинг гигантской кодовой базы), также процессор, используемый для выполнения кода, был Intel Core 2 Quad, который является идеальным процессором для такой вещи, но результаты были шокирующими. Сам компилятор содержит множество способов оптимизации кода, в том числе нацеливание на конкретный процессор с точки зрения, скажем, возможностей SSE . Это действительно делает -O2/ -O3убегает стыдно. И это былоперед использованием профилировщика.

Обратите внимание, что, однако, включение действительно агрессивных оптимизаций заставит компиляцию занять некоторое время, два часа для большого проекта вовсе не невозможны. Кроме того, при высоких уровнях оптимизации существует большая вероятность появления ошибки в коде (это также можно наблюдать с помощью gcc -O3). Для проекта, который вы хорошо знаете, это может быть плюсом, поскольку вы найдете и исправите возможные ошибки, которые вы не уловили ранее, но при составлении волосатого беспорядка вы просто скрещиваете пальцы и молитесь богам x86.

Немного о производительности на машинах AMD: она не так хороша, как процессоры Intel, но все же намного лучше, чем компилятор MS C ++ (опять же из моего опыта). Причина в том, что вы также можете выбрать общий процессор с поддержкой SSE2 (например). Тогда процессоры AMD с SSE2 не будут сильно различаться. Тем не менее, компилятор Intel на процессоре Intel действительно ворует шоу. Однако это не все двойные радуги и блестящие единороги. Были некоторые серьезные обвинения в том, что двоичные файлы вообще не работают на процессорах, не принадлежащих к GenuineIntel, и (это признается) искусственно вызвали снижение производительности на процессорах других производителей., Также обратите внимание, что это информация по крайней мере 3 года назад, и ее действительность на данный момент неизвестна, НО описания нового продукта дают двоичным картам карт-бланш для медленной работы, которую Intel считает подходящей для процессоров других производителей.

Я не знаю, что это за Intel и почему они делают такие хорошие инструменты для числовых вычислений, но взгляните на это тоже: http://julialang.org/ . Есть сравнение, и если вы посмотрите на последний ряд, MATLAB сияет, побеждая и код на C, и Джулию , и меня поражает то, что авторы считают, что причина - Math Kernel Library от Intel .

Я понимаю, что это звучит очень похоже на рекламу инструментария Intel Compiler, но по моему опыту это действительно хорошо сработало, и даже простая логика подсказывает, что парни, которые делают процессоры, должны лучше знать, как программировать для них. IMO, компилятор Intel C ++ сжимает каждый последний возможный прирост производительности.

K.Steff
источник
@ K.Steff Вы сравнили этот компилятор с MS с оптимизацией всей программы и профилей.
повторно запустить
2
Intel была вынуждена сообщить, что их компилятор намеренно использует неоптимизированные пути кода во время выполнения, если процессор не производится Intel. У Intel проблемы с FTC . Вы не могли заплатить мне, чтобы использовать ICC. Я бы не трогал этот антиконкурентный кусок дерьма 10-футовым шестом.
doug65536
@ doug65536 Вопрос, который задают: «Действительно ли компиляторы Intel лучше», а не «Является ли Intel монополистом на рынке аппаратного обеспечения, который злоупотребляет этой монополией для дальнейшего завоевания позиций в программном обеспечении». Я не говорю, что ваш комментарий является оффтопом, но для меня идеологии нет места в этой дискуссии. Используйте или нет - ваш вызов, но это не изменит тот факт, что ICC чертовски хорош в производстве двоичных файлов для процессоров Intel.
К.Стефф
Язык C, ставший популярным в 1990-х годах, расширил язык C многими способами, что позволило программистам писать более эффективный код, но некоторые оптимизирующие компиляторы не поддерживают. Насколько я могу судить, Microsoft менее охотно, чем другие поставщики, занималась оптимизацией, которая была бы несовместима с такими расширениями. Это делает их компиляторы менее эффективными, чем те, которые не заботятся о такой совместимости при обработке кода, который не требует их, но позволяет корректно обрабатывать код, который их требует.
суперкат
35

Intel Compiler имеет репутацию производителя очень эффективного числового кода:

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/

Пожалуйста , обратите внимание , что я не утверждаю , что он является самым быстрым компилятором там, но это , безусловно , имеет очень хорошую репутацию эффективности. Обратите внимание, что авторы «официальных» двоичных файлов LAPACK для Windows используют компилятор Intel Fortran для их сборки: http://icl.cs.utk.edu/lapack-for-windows/, и они должны кое-что знать об эффективности.

quant_dev
источник
2
Он не только имеет эту репутацию, но и оправдывает ее. Это не обязательно, если вы используете его для написания CRUD-приложений, но продукты C, C ++ и FORTRAN абсолютно необработанны, когда дело доходит до сокращения чисел.
Blrfl
27

Intel C ++ имеет несколько преимуществ перед gcc в дополнение к генератору кода. Оба из них (в значительной степени) связаны с тем, что он основан на интерфейсе EDG . Что бы там ни было, оба они (медленно) разрушаются, поэтому преимущества не так велики, как раньше.

Во-первых, как правило, он выдает гораздо лучшие сообщения об ошибках. Возможно, вы захотите взглянуть на сравнение сообщений об ошибках между Clang и gcc. Intel C ++ (наряду с большинством других, основанных на интерфейсе EDG) выпускает диагностические средства, аналогичные Clang, в течение многих лет.

Во-вторых, интерфейс EDG также хорошо известен как исключительно хорошая языковая совместимость, так как генератор кода Intel предназначен для создания быстрого кода. Практически любой разумной мерой интерфейс EDG обеспечивает лучшее соответствие C ++ 98, 03 или (в текущих версиях) C ++ 0x, чем любой другой доступный компилятор.

Как я уже сказал, оба эти преимущества со временем размывались. Последние версии gcc довольно прилично соответствуют языку. Clang имеет значительно более качественные сообщения об ошибках, и также делает успехи в реализации всего языка C ++. Однако когда вы приступите прямо к этому вопросу, Intel C ++ по-прежнему лучше, чем любой из них в обоих отношениях, и это один пакет, который делает большинство вещей правильно, вместо того, чтобы нуждаться в одном компиляторе для хорошей диагностики и другом для лучшей совместимости и генерации кода.

Джерри Гроб
источник
14

Мы попробовали это на работе некоторое время назад. Большая часть нашей кодовой базы находится в Delphi, но у нас есть некоторые высокопроизводительные вычислительные функции, которые кто-то думал, что было бы хорошей идеей сделать в C ++ DLL, когда. И один из моих коллег услышал много хорошего о компиляторе Intel, поэтому решил попробовать. Мы перестроили DLL в компиляторе Intel и провели несколько тестов скорости, и результаты настолько его удивили, что он решил, что, должно быть, что-то делает не так.

DLL должна вычислить некоторые очень сложные проблемы с компонентами комбинаторики и топологии, которые технически относятся к классу сложности NP-hard, если мы сделали их «правильно», но мы используем различные эвристические методы, чтобы избежать производительности NP. Несмотря на это, происходит большое количество цифр. И для тестов, которые мы проводили, разница между компилятором VS и компилятором Intel была либо в пределах epsilon, либо компилятор Intel был заметно медленнее, обычно где-то в районе 20%. И так было, независимо от того, какие изменения он внес в настройки компиляции, чтобы заставить компилятор Intel создавать более быстрый код. Так что в итоге мы не переключились на него.

Конечно, это только один пример из реальной жизни. Ваш пробег может варьироваться.

Мейсон Уилер
источник
Не могли бы вы поделиться информацией о процессоре, на котором выполнялись тесты?
Дуб
22
Когда я прочитал ваш первый абзац, я подумал, что вы говорите, что результаты теста скорости его приятно удивили . Видимо, это неправильно, прочитав второй абзац. Не уверен, что ввел меня в заблуждение при первом чтении; при ближайшем рассмотрении вы фактически не используете никаких положительных слов, которые могли бы оставить меня с таким восприятием. Подумал, что прокомментирую, если кто-то еще совершит ту же ошибку и будет смущен тем, что вы на самом деле говорите здесь.
Коди Грей
2
Вы использовали процессор AMD для тестирования? Я думаю, что это важная информация (независимо от того, плохо ли работал компилятор нарочно или он не мог ничего сделать, даже когда делал все возможное).
Восстановить Монику
3
Это процессор Intel Core i7.
Мейсон Уилер
Короткая версия: Intel была медленнее, чем VS2010. Я также попробовал это на работе не так давно на кодовой базе довольно краткого хруста данных C ++. Я пробовал много разных настроек. Некоторые отдельные алгоритмы с уже существующими тестами производительности стали заметно быстрее, но наиболее заметно медленнее. В целом все операции высокого уровня, которые я выполнял с программным обеспечением, были последовательно и заметно медленнее. Я также попробовал это с версиями компилятора Intel в 2013 и 2010 годах. Похоже, что в 2010 году продукты лучше кодируются и более стабильны. Большинство моих тестов были на pre-AVX i7, но некоторые были на более старом Core2.
Рич
9

Во встроенном приложении, над которым я когда-то работал, испытание компилятора Intel показало, что это избавит нас от необходимости раскручивать новое оборудование с более высокой производительностью. Стоимость нового оборудования составляла около 10 долларов США за единицу, прогнозируемые продажи - 1 миллион единиц, добавьте стоимость разработки и задержки проекта. Вариантом 2 был профиль / микрооптимизация уже достаточно хорошо профилированной / оптимизированной базы кода - неизвестные результаты, неизвестное время.

Как вы думаете, что сказал начальник, когда мы попросили средства на покупку компилятора .......

Однако - это был очень удачный и более редкий случай - 10% более быстрый вывод кода компилятором Intel подтолкнул нас к правильной стороне производительности. Если бы мы были уже на правой стороне, или были бы на 10% больше, это не имело бы никакого значения. Если бы у нас были инженеры, мы, вероятно, могли бы оптимизировать код и сохранить аппаратное вращение и не нуждаться в компиляторе Intel, но риск был высоким, и компилятор Intel работал дешевле, чем время разработки.

В итоге я бы сказал, что это форма микрооптимизации - не делайте этого, пока не узнаете, что вам нужно, и только после того, как вы профилировали и нашли реальную причину проблем. Это особенно удачный выбор вашего профиля, который показывает, что вы медлительны «везде» и у вас нет определенных узких мест.

mattnz
источник
5

Я только столкнулся с тремя преимуществами:

  1. Он поддерживает функции новых процессоров Intel гораздо раньше, чем другие компиляторы.

  2. Это отличный дополнительный компилятор для выдачи предупреждений и выявления проблем, которые пропускают другие компиляторы. GCC ловит некоторые вещи, которые ICC не делает, и наоборот. Visual studio ловит некоторые вещи, которые ICC не делает, и наоборот.

  3. Он намного лучше выполняет циклы параллелизации (автоматически распределяя их по нескольким потокам), чем любой другой компилятор. Код не очень выигрывает от этого, но когда у вас есть код, который может это сделать, это может иметь огромное значение.

Дэвид Шварц
источник
3

Мы используем компилятор intel для каждого критичного к производительности проекта нашей кодовой базы. Самое замечательное в этом то, что оптимизирующий код действительно поддерживается. Вместо того, чтобы вручную добавлять вызовы __mm повсюду и указывать компилятору на предварительную выборку данных, и все это снова будет неоптимальным в следующем выпуске, вы просто немного переставляете код и получаете безумное ускорение.

Часто за оптимизированным кодом легче следовать, чем за оптимизированную руку, это быстрее, чем за оптимизированную руку, и когда выпускается новый набор инструкций, компилятор будет использовать этот набор инструкций. Это фантастика.

То же самое касается и компилятора arm (от arm, а не intel), если ваш релиз на arm, делает большую работу в векторизации для вас.

martiert
источник
+1. У Intel есть ARM-компилятор? Unbeleivable!
1
Нет, у Intel нет компилятора ARM. ARM имеет компилятор ARM, который делает фантастическую работу.
Мартиерт
2
«РЕДАКТИРОВАТЬ: arm не имеет компилятора arm». это действительно то, что вы имели в виду?
luiscubal
0

Проверьте эту страницу тестов. Короче говоря, Intel выигрывает.

Но маржа может быть не такой большой: если вы компилируете в 32-битную систему и ваша система сборки не может поддерживать оптимизацию по профилю, выигрыш составляет порядка 10%. Стоит ли такое улучшение проблем и более продолжительное время компиляции?

JDV-Ян де Ваан
источник
Ссылка URL кажется мертвой.
контанго
0

Говорят, что Intel выпустила компилятор Intel C ++ v13.0 для ОС Android, свою первую попытку предложить оптимизирующий компилятор C / C ++, разработанный специально для мобильной платформы Google.

Разработчики могут использовать компилятор в системах на базе Linux * для создания приложений для устройств Android на базе процессоров Intel, включая процессор Intel® Atom ™. Компилятор Intel совместим с GNU C ++ и инструментами разработчика в Android Native Development Kit (NDK). Компилятор также нельзя использовать ни на одной машине для разработки. Ни Windows, ни OS X не поддерживаются; инструменты сертифицированы только для использования с Ubuntu 10.04 или 11.04

В текущей версии Android NDK по умолчанию используется версия 4.6 набора инструментов Gnu Compiler Collection (GCC) с открытым исходным кодом. Но компиляторы Intel включают множество запатентованных оптимизаций для своих собственных чипов и могут часто выводить исполняемый код, который работает лучше, чем код, создаваемый сторонними компиляторами, такими как GCC.

LOG_TAG
источник