/arch
x86
Задает архитектуру для создания кода на платформе x86. Дополнительные сведения о других целевых архитектурах см. в /arch
статьях /arch
(ARM64), (x64)/arch
и /arch
(ARM).
Синтаксис
/arch:
[IA32
AVX10.1
|AVX512
|AVX2
|||AVX
|SSE
SSE2
]
Аргументы
/arch:IA32
Указывает на то, что расширенные инструкции не используются. Также указывает на использование инструкций x87 для вычислений с плавающей запятой.
/arch:SSE
Включает расширения SIMD для потоковой передачи Intel.
/arch:SSE2
Включает расширения SIMD для потоковой передачи Intel 2. Набор инструкций по умолчанию — SSE2, если параметр не /arch
указан.
/arch:AVX
Включает расширения расширенного вектора Intel.
/arch:AVX2
Включает расширения расширенного вектора Intel 2.
/arch:AVX512
Включает расширения расширенного вектора Intel 512.
/arch:AVX10.1
Включает расширения Расширенного вектора Intel 10 версии 1.
Замечания
Параметр /arch
включает или отключает использование определенных расширений наборов инструкций, особенно для вычислений векторов, доступных в процессорах Intel и AMD. Как правило, недавно появившиеся процессоры могут поддерживать расширения за пределами тех, которые поддерживаются старыми процессорами. Перед выполнением кода с помощью расширения набора инструкций необходимо ознакомиться с документацией по конкретному обработчику или проверить поддержку __cpuid
расширения набора инструкций. Вы также можете использовать встроенные __check_isa_support
функции ЦП для проверки часто используемых функций ЦП.
/arch
влияет только на создание кода для собственных функций. /clr
При компиляции /arch
не влияет на создание кода для управляемых функций.
Параметры /arch
относятся к расширениям набора инструкций со следующими характеристиками:
IA32
— это устаревший 32-разрядный набор инструкций x86 без векторных операций и использование x87 для вычислений с плавающей запятой.SSE
позволяет вычислять с векторами до четырех значений с плавающей запятой с одной точностью. Добавлены соответствующие скалярные инструкции с плавающей запятой.SSE2
позволяет вычислять с 128-разрядными векторами одноточия, двойной точности и 1, 2, 4 или 8-байтовых целочисленных значений. Кроме того, были добавлены скалярные инструкции с двойной точностью.AVX
ввел альтернативную кодировку инструкций для векторных и скалярных инструкций с плавающей запятой. Он позволяет векторам либо 128 бит, либо 256 битам, и ноль расширяет все результаты вектора до полного размера вектора. (Для устаревшей совместимости векторные инструкции в стиле SSE сохраняют все биты за пределами бита 127.) Большинство операций с плавающей запятой расширяются до 256 бит.AVX2
Расширяет большинство целых операций до 256-разрядных векторов и позволяет использовать инструкции Fused Multiply-Add (FMA).AVX512
появилась другая форма кодирования инструкций, которая позволяет использовать 512-разрядные векторы, маскирование, внедренное округление и трансляцию, а также новые инструкции. ДлинаAVX512
вектора по умолчанию составляет 512 битов и может быть изменена на 256 бит с помощью флага/vlen
.AVX10.1
добавляет дополнительные инструкции поверхAVX-512
. ДлинаAVX10.1
вектора по умолчанию составляет 256 битов и может быть изменена на 512 бит с помощью флага/vlen
.
Оптимизатор выбирает, когда и как использовать векторные инструкции в зависимости от указанного /arch
значения. Скалярные вычисления с плавающей запятой обычно выполняются с инструкциями SSE или AVX при наличии. Некоторые соглашения о вызовах указывают передачу аргументов с плавающей запятой в стеке x87, и в результате код может использовать сочетание инструкций x87 и SSE/AVX для вычислений с плавающей запятой. Инструкции целочисленного вектора также можно использовать для некоторых 64-разрядных целых операций при наличии.
Помимо векторов и скалярных инструкций с плавающей запятой, каждый /arch
параметр также может включать использование других невекторных инструкций, связанных с этим параметром. Примером является семейство инструкций CMOVcc, которое впервые появилось на процессорах Intel Intel Xeon Pro. Так как инструкции SSE были введены с последующим процессором Intel Intel III, инструкции CMOVcc могут создаваться, за исключением случаев, когда /arch:IA32
указано.
Операции с плавающей запятой обычно округляются до двойной точности (64-разрядная версия) в коде x87, но можно использовать _controlfp
для изменения слова элемента управления FP, включая настройку элемента управления точностью для расширенной точности (80-разрядная) или одноточие (32-разрядная). Дополнительные сведения см. в разделе _control87
, __control87_2
_controlfp
. SSE и AVX имеют отдельные инструкции по одноточию и двойной точности для каждой операции, поэтому для кода SSE/AVX нет эквивалента. Он может изменить, как результаты округляются, когда результат операции с плавающей запятой используется непосредственно в дальнейшем вычислении, а не присваивает ей переменную пользователя. Рассмотрим следующие операции:
r = f1 * f2 + d; // Different results are possible on SSE/SSE2.
С явным назначением:
t = f1 * f2; // Do f1 * f2, round to the type of t.
r = t + d; // This should produce the same overall result
// whether x87 stack is used or SSE/SSE2 is used.
/arch
и /QIfist
не может использоваться вместе. Параметр /QIfist
изменяет поведение округления с плавающей запятой на целочисленное преобразование. Поведение по умолчанию — усечение (округление к нулю), в то время как /QIfist
параметр указывает использование режима округления среды с плавающей запятой. Так как параметр изменяет поведение всех значений с плавающей запятой на целочисленные преобразования, /QIfist
не рекомендуется. При компиляции для SSE или AVX можно округить значение с плавающей запятой до целого числа с помощью режима округления среды с плавающей запятой с помощью встроенной последовательности функций:
int convert_float_to_int(float x) {
return _mm_cvtss_si32(_mm_set_ss(x));
}
int convert_double_to_int(double x) {
return _mm_cvtsd_si32(_mm_set_sd(x));
}
Макросы _M_IX86_FP
, __AVX2__
__AVX512BW__
__AVX512F__
__AVX__
__AVX512DQ__
__AVX512VL__
__AVX512CD__
__AVX10_VER__
и макросы, указывающие, /arch
какой параметр компилятора был использован. Дополнительные сведения см. в разделе "Предопределенные макросы". Этот /arch:AVX2
параметр и __AVX2__
макрос были представлены в Visual Studio 2013 с обновлением 2 версии 12.0.34567.1. Добавлена ограниченная поддержка /arch:AVX512
в Visual Studio 2017 и расширена в Visual Studio 2019. /arch:AVX10.1
Поддержка добавлена в Visual Studio 2022.
Установка параметра компилятора /arch
в Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойств сборки в Visual Studio.
Перейдите на страницу свойств Свойства конфигурации>C/C++>Создание кода.
Измените свойство Enable Enhanced Instruction Set .
Установка данного параметра компилятора программным способом
- См. раздел EnableEnhancedInstructionSet.
См. также
/arch
(Минимальная архитектура ЦП)
Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC