2012-01-17 4 views
3

Как отключить автоинъекцию (SSE2), глобально или для определенного цикла for, не возвращаясь в/Od в MSVS 2010?Компилятор Microsoft C++: как отключить автоинъекцию с помощью/O2?

Я пробовал все 3 возможных варианта для Enable Enhanced Instruction Set, включая «Не задано», но безрезультатно.

P. S. Любопытно, что даже/Od не помогает.

+2

Просто любопытно: почему? –

+2

@ DanielFischer: Почему я хочу отключить векторизацию? По двум причинам: оценить повышение производительности от использования SSE2 и обеспечить последовательное и значимое сравнение производительности с машинами, не имеющими SSE. –

+2

Возможно, следующее может иметь значение: http://stackoverflow.com/questions/1480916/how-do-i-enable-the-sse-sse2-instruction-set-in-visual-studio-2008-using-cmake – NPE

ответ

2

Для конкретного цикла, вы можете добавить прагму:

#pragma loop(no_vector) 

Это на самом деле documented on MSDN (хотя я только нашел его там после того, как я узнал об этом ..)

Если вы не Как добавить прагму, вы можете выбрать компиляцию с /favor:ATOM. Это немного взломать, но это позволит вам отключить авто-векторию, не касаясь источника, и по-прежнему оптимизировать скорость в противном случае.

В качестве альтернативы существуют две стратегии оптимизации /O1 «Оптимизация размера» и /Os «Благоприятный небольшой код». Авто-векторизация генерирует существенно больше кода, поэтому, если вы оптимизируете размер, автоматическая векторизация отключается.

Я узнал все это недавно, прочитав auto-vectorization cookbook. См. Последнюю строку раздела «Правила для тела цикла».

Отказ от ответственности: Я пока не использую компилятор VS2012 (требуется поддержка Win XP), поэтому я не тестировал это. Кроме того, коммутаторы компилятора могут работать по-другому в 2013 году или позже.

+0

Спасибо за ссылку! Кстати, вы видели, что для XP существует специальная среда исполнения vc11? Я считаю, что вы можете использовать компилятор 2012 года и время работы с XP. –

2

Вы могли бы изолировать for петлю в отделенной функции и попытаться использовать #pragma optimize для него:

// Disable all optimizations 
#pragma optimize("", off) 

// your function here 

// Enable them back 
#pragma optimize("", on) 

... но это должно иметь тот же эффект /Od только на этой конкретной функции, поэтому она может нет помощи.

Если вы компилируете для x86 (а не x86_64, где это не действует), вы также можете отключить набор инструкций SSE2 в целом (удаление опции /arch:SSE2). К сожалению, его гранулярность ограничена целым исходным файлом.

+0

Спасибо, что надо работать - векторизация в/Od происходит только в x64 (почему?), Но это не совсем то, что я хочу, поскольку счетчик циклов даже не заблокирован в регистре в/Od. Влияние производительности будет связано не только с векторизации. –

0

Убедитесь, что параметр компилятора /arch не установлен.

+0

Я сделал, он не установлен. –

0

Какой компилятор? AFAIK, VS будет реализовывать автоматическую вектологию, начиная с версии 11. VS использует команды SSE для плавающей запятой, но это не значит, что она фактически векторизует циклы.

+0

VC 2010. Вы имеете в виду, что я неправильно истолковываю термин «векторизация»? –

+0

Думаю, да, да. – zvrba