Компилятор Microsoft C ++: как отключить автоматическую векторизацию с помощью / O2?

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

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

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


person Violet Giraffe    schedule 17.01.2012    source источник
comment
@DanielFischer: Почему я хочу отключить векторизацию? По двум причинам: для оценки повышения производительности от использования SSE2 и для обеспечения последовательного и значимого сравнения производительности с машинами, на которых нет SSE.   -  person Violet Giraffe    schedule 18.01.2012
comment
Возможно, уместно следующее: stackoverflow.com/questions/1480916/   -  person NPE    schedule 18.01.2012
comment
В этом есть смысл. Спасибо за удовлетворение моего любопытства. Хотел бы я ответить взаимностью.   -  person Daniel Fischer    schedule 18.01.2012
comment
@aix: Спасибо, обновил вопрос.   -  person Violet Giraffe    schedule 18.01.2012


Ответы (4)


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

#pragma loop(no_vector) 

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

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

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

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

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

person Community    schedule 14.09.2013
comment
Спасибо за ссылку! Кстати, вы видели, что для XP есть специальная среда выполнения vc11? Я считаю, что именно так можно использовать компилятор 2012 года и среду выполнения с XP. - person Violet Giraffe; 15.09.2013

Вы можете изолировать свой цикл for в отдельной функции и попробовать использовать _ 2_ за это:

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

// your function here

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

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

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

person Matteo Italia    schedule 17.01.2012
comment
Спасибо, это должно сработать - векторизация в / Od происходит только в x64 (почему?), Но это не совсем то, что я хочу, поскольку счетчик циклов даже не заблокирован в регистре в / Od. Влияние на производительность будет не только из-за векторизации. - person Violet Giraffe; 18.01.2012

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

person zdan    schedule 17.01.2012

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

person zvrba    schedule 17.01.2012
comment
VC 2010. Вы имеете в виду, что я неправильно понимаю термин векторизация? - person Violet Giraffe; 18.01.2012