Udostępnij za pośrednictwem


/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:[IA32AVX10.1|AVX512|AVX2|||AVX|SSESSE2]

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. Możesz również użyć __check_isa_support funkcji wewnętrznych, aby sprawdzić, czy są używane częściej używane funkcje procesora CPU.

/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 to AVX512 512 bitów i można ją zmienić na 256 bitów przy użyciu flagi /vlen .

  • AVX10.1 dodaje więcej instrukcji na stronie AVX-512. Domyślna długość wektora to AVX10.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

  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