Компилятор Microsoft C ++: как отключить автоматическую векторизацию с / O2? - PullRequest
3 голосов
/ 18 января 2012

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

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

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

Ответы [ 4 ]

2 голосов
/ 15 сентября 2013

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

#pragma loop(no_vector) 

На самом деле задокументировано на MSDN (хотя я нашел его там только после того, как узнал об этом ..)

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

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

Недавно я узнал обо всем этом, прочитав поваренную книгу по векторизации . См. Последнюю строку раздела «Правила для тела цикла».

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

2 голосов
/ 18 января 2012

Вы можете изолировать ваш цикл 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 голосов
/ 18 января 2012

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

0 голосов
/ 18 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...