Анализ проблем оптимизации для конкурирующих CPU в компиляторе Intel

В статье "Will Intel be forced to remove the "cripple AMD" function from their compiler?" разбираются особенности работы компиляторов Intel, приводящие к понижению производительности собранных программ на процессорах AMD и VIA. По заявлению Intel различия в производительности объясняются преимуществами процессоров Intel, но Федеральная торговая комиссия США считает, что замедление вызвано искусственно с целью понижения конкурентоспособности процессоров других компаний.

Компилятор Intel предусматривает возможность включения в итоговый исполняемый файл нескольких оптимизирующих блоков кода, используемых в зависимости от CPU на котором выполняется приложение. В качестве примера приводится задействование инструкций SSE2 и SSE3 для поддерживающих их процессоров. При выборе стратегии оптимизации учитывается не только тип поддерживаемых наборов дополнительных инструкций, но и идентификатор производителя. Если в качестве производителя фигурирует Intel используется заведомо более оптимальный набор кода, а в противном случае - не оптимизированный вариант, даже если процессор полностью поддерживает технологии, позволяющие активировать более оптимальный набор кода.

Так как набор компиляторов Intel рекламируется как генерирующий наиболее производительный код, а тесты на CPU Intel это подтверждают, то многие разработчики используют для генерации итоговых исполняемых файлов ICC, не подозревая, что их приложения могут потерять в производительности при работе на CPU AMD и VIA. Например, один из тестов для процессора "VIA Nano" показал, что при подмене CPUID идентификатора данного процессора на одну из моделей CPU AMD производительность улучшилась на 10%, а при изменении на Intel производительность возросла на 47% (за счет использования SSE).

Детальный разбор алгоритма работы ICC показал, что подобное поведение скорее всего не является злым умыслом и связано с особенностью выбора плана оптимизации, при котором выбор делается на основании модели процессора (CPUID), а не списка поддерживаемых наборов инструкций. Иначе говоря, компилятор знает только об известных в момент подготовки релиза компилятора моделях CPU. Если попытаться выполнить на новейшем CPU программу, собранную старой версией компилятора, то оптимизация не будет активирована. Тем не менее, подобный подход не оправдывает то, что SSE-оптимизации для процессоров AMD не активируются даже в самом последнем релизе ICC (11.1.054).

В качестве вариантов решения проблемы предлагается:

  • Использовать другой компилятор, например, GCC;
  • Заменить в исполняемом файле код диспетчера выбора плана оптимизации. Код альтернативного диспетчера был в частности представлен в руководстве по оптимизации для C++;
  • Для AMD процессоров подменить CPUID на близкий по возможностям процессор Intel, воспользовавшись технологией виртуализации.

©  OpenNet