Компилятор Intel против GCC - PullRequest
       11

Компилятор Intel против GCC

6 голосов
/ 30 ноября 2011

Когда я компилирую приложение с помощью компилятора Intel, это происходит медленнее, чем когда я компилирую его с помощью GCC.Выход компилятора Intel более чем в 2 раза медленнее.Приложение содержит несколько вложенных циклов.Есть ли какие-то различия между GCC и компилятором Intel, которые мне не хватает?Нужно ли включать некоторые другие флаги для улучшения производительности компилятора Intel?Я ожидал, что компилятор Intel будет по крайней мере так же быстр, как GCC.

Версии компилятора:

 Intel version  12.0.0 20101006 
 GCC   version  4.4.4  20100630

Флаги компилятора одинаковы для обоих компиляторов:

-O3 -openmp -parallel -mSSE4.2 -Wall -pthread

Ответы [ 2 ]

3 голосов
/ 30 ноября 2011

У меня нет опыта работы с компилятором intel, поэтому я не могу ответить, отсутствуют ли у вас некоторые флаги или нет.

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

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

Обратите внимание, что я говорю о потенциале оптимизации только когда сравниваю gcc с icc.В конце концов, icc может генерировать более быстрый код, чем gcc, но не так много, потому что он выполняет больше оптимизаций, а потому, что он имеет более быструю реализацию стандартной библиотеки и потому, что он умнее, где оптимизировать (на высоких уровнях оптимизации gcc получает немногоПерерасход (или, по крайней мере, раньше) касательно размера торгового кода для (теоретического) улучшения времени выполнения. Это может фактически снизить производительность, например, когда тщательно развернутый и векторизованный цикл выполняется только с 3 итерациями.

2 голосов
/ 30 ноября 2011

Я обычно использую -inline-level=1 -inline-forceinline, чтобы убедиться, что функции, которые я явно объявил inline, действительно встроены.Кроме этого, я ожидал бы, что производительность ICC будет, по крайней мере, такой же хорошей, как и у gcc.Вам нужно будет профилировать свой код, чтобы увидеть, откуда исходит разница в производительности.Если это Linux, то я рекомендую использовать Zoom , который вы можете получить на бесплатной 30-дневной оценке.

...