/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
AVX10.1
|AVX512
|AVX2
|||AVX
|SSE
SSE2
]
Argumenty
/arch:IA32
Określa żadnych rozszerzonych instrukcji, a także określa x87 dla obliczeń zmiennoprzecinkowych.
/arch:SSE
Włącza rozszerzenia SIMD intel streaming.
/arch:SSE2
Włącza rozszerzenia SIMD intel streaming 2. Domyślny zestaw instrukcji to SSE2, jeśli nie /arch
określono żadnej opcji.
/arch:AVX
Włącza rozszerzenia Intel Advanced Vector.
/arch:AVX2
Włącza rozszerzenia Intel Advanced Vector 2.
/arch:AVX512
Włącza rozszerzenia Intel Advanced Vector 512.
/arch:AVX10.1
Włącza rozszerzenia Intel Advanced Vector Extensions 10 w wersji 1.
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 inny formularz kodowania instrukcji, który umożliwia 512-bitowe wektory, maskowanie, osadzone zaokrąglanie/emisję i nowe instrukcje. Domyślna długość wektora toAVX512
512 bitów i można ją zmienić na 256 bitów przy użyciu flagi/vlen
.AVX10.1
dodaje więcej instrukcji na stronieAVX-512
. Domyślna długość wektora toAVX10.1
256 bitów i można ją zmienić na 512 bitów przy użyciu flagi/vlen
.
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 są zwykle 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ć razem. 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
jest przestarzała. 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
, , __AVX512F__
__AVX512BW__
__AVX2__
__AVX__
__AVX512DQ__
__AVX512VL__
__AVX512CD__
i __AVX10_VER__
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. /arch:AVX10.1
Dodano obsługę programu Visual Studio 2022.
Aby ustawić opcję kompilatora /arch
w programie Visual Studio
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).
Wybierz stronę właściwości Właściwości>konfiguracji C/C++>Code Generation.
Zmodyfikuj właściwość Włącz zestaw instrukcji rozszerzonych.
Aby programowo ustawić tę opcję kompilatora
- Zobacz: EnableEnhancedInstructionSet.
Zobacz też
/arch
(Minimalna architektura procesora CPU)
Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC