/arch (x86)

Określa architekturę generowania kodu na x86. Aby uzyskać więcej informacji na temat /arch innych architektur docelowych, zobacz /arch (ARM64), /arch (x64)i /arch (ARM).

Składnia

/arch:[IA32|SSE|SSE2|AVX|AVX2|AVX512]

Argumenty

/arch:IA32
Określa żadnych rozszerzonych instrukcji, a także określa x87 dla obliczeń zmiennoprzecinkowych.

/arch:SSE
Umożliwia korzystanie z instrukcji SSE.

/arch:SSE2
Umożliwia korzystanie z instrukcji SSE2. Ta opcja jest domyślną instrukcją ustawioną na platformach x86, jeśli nie /arch określono żadnej opcji.

/arch:AVX
Umożliwia korzystanie z instrukcji intel Advanced Vector Extensions.

/arch:AVX2
Umożliwia korzystanie z instrukcji Intel Advanced Vector Extensions 2.

/arch:AVX512
Umożliwia korzystanie z instrukcji Intel Advanced Vector Extensions 512.

Uwagi

Opcja /arch włącza lub wyłącza korzystanie z niektórych rozszerzeń zestawu instrukcji, szczególnie w przypadku obliczeń wektorowych dostępnych w procesorach firmy Intel i AMD. Ogólnie rzecz biorąc, ostatnio wprowadzone procesory mogą obsługiwać rozszerzenia poza te obsługiwane przez starsze procesory. Przed wykonaniem kodu przy użyciu rozszerzenia zestawu instrukcji należy zapoznać się z dokumentacją dla określonego procesora lub testu, korzystając __cpuid z rozszerzenia zestawu instrukcji.

/arch Dotyczy tylko generowania kodu dla funkcji natywnych. W przypadku użycia /clr polecenia do kompilowania /arch nie ma wpływu na generowanie kodu dla funkcji zarządzanych.

Opcje /arch odnoszą się do rozszerzeń zestawu instrukcji o następujących cechach:

  • IA32 jest starszym zestawem instrukcji x86 w wersji 32-bitowej bez żadnych operacji wektorowych i używaniem x87 do obliczeń zmiennoprzecinkowych.

  • SSE umożliwia obliczanie z wektorami z maksymalnie czterema wartościami zmiennoprzecinkowymi o pojedynczej precyzji. Dodano również odpowiednie instrukcje zmiennoprzecinkowe skalarne.

  • SSE2 umożliwia obliczanie z 128-bitowymi wektorami jednoosobowej precyzji, podwójnej precyzji i 1, 2, 4 lub 8-bajtowej liczby całkowitej. Dodano również instrukcje skalarne o podwójnej precyzji.

  • AVX wprowadzono alternatywne kodowanie instrukcji dla instrukcji wektorowych i zmiennoprzecinkowych. Umożliwia on wektory 128 bitów lub 256 bitów, a zero rozszerza wszystkie wyniki wektorów do pełnego rozmiaru wektora. (W przypadku starszej zgodności instrukcje wektorów stylu SSE zachowują wszystkie bity poza bitem 127). Większość operacji zmiennoprzecinkowych jest rozszerzana na 256 bitów.

  • AVX2 Rozszerza większość operacji całkowitych na wektory 256-bitowe i umożliwia korzystanie z instrukcji Fused Multiply-Add (FMA).

  • AVX512 wprowadzono inną formę kodowania instrukcji, która umożliwia wektory 512-bitowe oraz niektóre inne funkcje opcjonalne. Dodano również instrukcje dotyczące innych operacji.

Optymalizator wybiera, kiedy i jak używać instrukcji wektorów w zależności od tego, który /arch z nich jest określony. Obliczenia zmiennoprzecinkowe skalarne są wykonywane za pomocą instrukcji SSE lub AVX, gdy są dostępne. Niektóre konwencje wywoływania określają przekazywanie argumentów zmiennoprzecinkowych na stosie x87, a w rezultacie kod może używać kombinacji instrukcji x87 i SSE/AVX na potrzeby obliczeń zmiennoprzecinkowych. Instrukcje wektorów całkowitych mogą być również używane w przypadku niektórych 64-bitowych operacji całkowitych, gdy są dostępne.

Oprócz instrukcji skalarnych wektorów i zmiennoprzecinkowych każda /arch opcja może również włączyć korzystanie z innych instrukcji niewektorowych skojarzonych z tą opcją. Przykładem jest rodzina instrukcji CMOVcc, która po raz pierwszy pojawiła się na procesorach Intel Pentium Pro. Ponieważ instrukcje SSE zostały wprowadzone z kolejnym procesorem Intel Pentium III, instrukcje CMOVcc mogą być generowane z wyjątkiem sytuacji, gdy /arch:IA32 jest określona.

Operacje zmiennoprzecinkowe są zwykle zaokrąglane do podwójnej precyzji (64-bitowej) w kodzie x87, ale można użyć _controlfp do zmodyfikowania wyrazu sterującego FP, w tym ustawienia kontrolki precyzji na rozszerzoną precyzję (80-bitową) lub pojedynczą precyzję (32-bitową). Aby uzyskać więcej informacji, zobacz _control87, _controlfp, __control87_2. Zestawy SSE i AVX mają oddzielne instrukcje o pojedynczej precyzji i podwójnej precyzji dla każdej operacji, więc nie ma odpowiednika kodu SSE/AVX. Może zmienić sposób zaokrąglania wyników, gdy wynik operacji zmiennoprzecinkowych jest używany bezpośrednio w dalszych obliczeniach, zamiast przypisywać je do zmiennej użytkownika. Rozważ następujące operacje:

r = f1 * f2 + d;  // Different results are possible on SSE/SSE2.

Z jawnym przypisaniem:

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 i /QIfist nie można ich używać w tym samym compiland. Opcja /QIfist zmienia zachowanie zaokrąglania liczby zmiennoprzecinkowych na liczbę całkowitą. Domyślnym zachowaniem jest obcinanie (zaokrąglanie do zera), natomiast /QIfist opcja określa użycie trybu zaokrąglania środowiska zmiennoprzecinkowego. Ponieważ opcja zmienia zachowanie wszystkich konwersji zmiennoprzecinkowych na liczbę całkowitą, /QIfist została wycofana. Podczas kompilowania dla SSE lub AVX można zaokrąglić wartość zmiennoprzecinkową do liczby całkowitej przy użyciu trybu zaokrąglania środowiska zmiennoprzecinkowego przy użyciu sekwencji funkcji wewnętrznej:

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));
}

Makra _M_IX86_FP, , __AVX__, __AVX512CD____AVX2____AVX512F__, __AVX512BW__, __AVX512DQ__ i __AVX512VL__ wskazują, które, jeśli istnieją, /arch opcja kompilatora została użyta. Aby uzyskać więcej informacji, zobacz Wstępnie zdefiniowane makra. Opcja /arch:AVX2 i __AVX2__ makro zostały wprowadzone w programie Visual Studio 2013 Update 2 w wersji 12.0.34567.1. Dodano ograniczoną obsługę /arch:AVX512 programu Visual Studio 2017 i rozszerzono w programie Visual Studio 2019.

Aby ustawić tę opcję kompilatora dla avX, AVX2, AVX512, IA32, SSE lub SSE2 w programie Visual Studio

  1. Otwórz okno dialogowe Strony właściwości dla projektu. Aby uzyskać więcej informacji, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilacji w programie Visual Studio).

  2. Wybierz stronę właściwości Właściwości>konfiguracji C/C++>Code Generation.

  3. Zmodyfikuj właściwość Włącz zestaw instrukcji rozszerzonych.

Aby programowo ustawić tę opcję kompilatora

Zobacz też

/arch (Minimalna architektura procesora CPU)
Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC