Поделиться через


/arch x86

Задает архитектуру для создания кода на платформе x86. Дополнительные сведения о других целевых архитектурах см. в /arch статьях /arch (ARM64), (x64)/arch и /arch (ARM).

Синтаксис

/arch:[IA32AVX10.1|AVX512|AVX2|||AVX|SSESSE2]

Аргументы

/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

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойств сборки в Visual Studio.

  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Создание кода.

  3. Измените свойство Enable Enhanced Instruction Set .

Установка данного параметра компилятора программным способом

См. также

/arch (Минимальная архитектура ЦП)
Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC