/arch (x86)

Gibt die Architektur für die Codegenerierung auf x86 an. Weitere Informationen zu /arch anderen Zielarchitekturen finden Sie unter /arch (ARM64),/arch(x64) und /arch (ARM).

Syntax

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

Argumente

/arch:IA32
Gibt keine erweiterten Anweisungen an, und gibt außerdem x87 für Gleitkommaberechnungen an.

/arch:SSE
Aktiviert die Verwendung von SSE-Anweisungen.

/arch:SSE2
Aktiviert die Verwendung von SSE2-Anweisungen. Diese Option ist der Standardanweisungssatz auf x86-Plattformen, wenn keine /arch Option angegeben ist.

/arch:AVX
Aktiviert die Verwendung von Intel Advanced Vector Extensions-Anweisungen.

/arch:AVX2
Aktiviert die Verwendung von Intel Advanced Vector Extensions 2-Anweisungen.

/arch:AVX512
Ermöglicht die Verwendung von Intel Advanced Vector Extensions 512-Anweisungen.

Hinweise

Die /arch Option aktiviert oder deaktiviert die Verwendung bestimmter Anweisungssatzerweiterungen, insbesondere für die Vektorberechnung, die in Prozessoren von Intel und AMD verfügbar ist. Im Allgemeinen können kürzlich eingeführte Prozessoren Erweiterungen unterstützen, die von älteren Prozessoren unterstützt werden. Sie sollten sich in der Dokumentation für einen bestimmten Prozessor oder einen Test für die Unterstützung von Anweisungssatzerweiterungen informieren __cpuid , bevor Sie Code mithilfe einer Anweisungssatzerweiterung ausführen.

/arch wirkt sich nur auf die Codegenerierung für systemeigene Funktionen aus. Wenn Sie zum Kompilieren verwenden /clr , /arch wirkt sich dies nicht auf die Codegenerierung für verwaltete Funktionen aus.

Die /arch Optionen beziehen sich auf Anweisungssatzerweiterungen mit den folgenden Merkmalen:

  • IA32 ist der ältere 32-Bit x86-Anweisungssatz ohne Vektorvorgänge und die Verwendung von x87 für Gleitkommaberechnungen.

  • SSE ermöglicht berechnungen mit Vektoren von bis zu vier Gleitkommawerten mit einfacher Genauigkeit. Entsprechende skalare Gleitkommaanweisungen wurden ebenfalls hinzugefügt.

  • SSE2 ermöglicht die Berechnung mit 128-Bit-Vektoren mit einfacher Genauigkeit, doppelter Genauigkeit und 1, 2, 4 oder 8 Byte ganzzahligen Werten. Es wurden auch Skalare-Anweisungen mit doppelter Genauigkeit hinzugefügt.

  • AVX es wurde eine alternative Anweisungscodierung für Vektor- und Gleitkommaskaeranweisungen eingeführt. Sie ermöglicht Vektoren von 128 Bit oder 256 Bit und erweitert alle Vektorergebnisse auf die vollständige Vektorgröße. (Aus Gründen der Legacykompatibilität behalten SSE-Vektoranweisungen alle Bits über Bit 127 hinaus bei.) Die meisten Gleitkommavorgänge werden auf 256 Bit erweitert.

  • AVX2 erweitert die meisten ganzzahligen Vorgänge auf 256-Bit-Vektoren und ermöglicht die Verwendung von FMA-Anweisungen (Fused Multi Add).

  • AVX512 Es wurde ein weiteres Anweisungscodierungsformular eingeführt, das 512-Bit-Vektoren sowie bestimmte andere optionale Features zulässt. Außerdem wurden Anweisungen für andere Vorgänge hinzugefügt.

Der Optimierer wählt aus, wann und wie Vektoranweisungen verwendet werden, je nachdem, welches /arch angegeben ist. Skalare Gleitkommaberechnungen werden bei Verfügbarkeit mit SSE- oder AVX-Anweisungen ausgeführt. Einige Aufrufkonventionen geben an, dass Gleitkommaargumente auf dem x87-Stapel übergeben werden. Daher kann ihr Code eine Mischung aus x87- und SSE/AVX-Anweisungen für Gleitkommaberechnungen verwenden. Ganzzahlige Vektoranweisungen können auch für einige 64-Bit-Ganzzahlvorgänge verwendet werden, wenn verfügbar.

Zusätzlich zu den Vektor- und Gleitkomma-Skalaranweisungen kann jede /arch Option auch die Verwendung anderer nicht Vektoranweisungen aktivieren, die dieser Option zugeordnet sind. Ein Beispiel ist die CMOVcc-Anweisungsfamilie, die zuerst auf den Intel Processor Pro-Prozessoren erschien. Da SSE-Anweisungen mit dem nachfolgenden Intel Processor III-Prozessor eingeführt wurden, können CMOVcc-Anweisungen generiert werden, es sei denn, es /arch:IA32 wird angegeben.

Gleitkommavorgänge werden normalerweise in x87-Code auf doppelte Genauigkeit (64-Bit) gerundet, sie können jedoch zum Ändern des FP-Steuerelementworts verwendet _controlfp werden, einschließlich des Festlegens des Präzisionssteuerelements auf erweiterte Genauigkeit (80-Bit) oder Einzelpräzision (32-Bit). Weitere Informationen finden Sie unter _control87, _controlfp, __control87_2. SSE und AVX verfügen über separate Einzelpräzisions- und Doppelgenauigkeitsanweisungen für jeden Vorgang, daher gibt es keine Entsprechung für SSE/AVX-Code. Sie kann ändern, wie Ergebnisse gerundet werden, wenn das Ergebnis eines Gleitkommavorgangs direkt bei der weiteren Berechnung verwendet wird, anstatt sie einer Benutzervariable zuzuweisen. Berücksichtigen Sie die folgenden Vorgänge:

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

Mit expliziter Zuordnung:

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 und /QIfist kann nicht auf demselben Kompiland verwendet werden. Die /QIfist Option ändert das Rundungsverhalten von Gleitkommazahlen in eine ganzzahlige Konvertierung. Das Standardverhalten besteht darin, den Rundungsmodus der Gleitkommaumgebung abzuschneiden (in Richtung Null gerundet), während die /QIfist Option die Verwendung des Rundungsmodus für Gleitkommapunkte angibt. Da die Option das Verhalten aller Gleitkommazahlen in ganzzahlige Konvertierungen ändert, /QIfist ist veraltet. Beim Kompilieren für SSE oder AVX können Sie einen Gleitkommawert mithilfe des Gleitkomma-Umgebungsumrundungsmodus mithilfe einer systeminternen Funktionssequenz auf eine ganze Zahl runden:

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

Die _M_IX86_FPMakros , __AVX__, , __AVX2__, __AVX512DQ____AVX512F____AVX512BW____AVX512CD__, und __AVX512VL__ die Makros geben an, welche Compileroption (falls vorhanden) /arch verwendet wurde. Weitere Informationen finden Sie unter Vordefinierte Makros. Die Option und __AVX2__ das /arch:AVX2 Makro wurden in Visual Studio 2013 Update 2, Version 12.0.34567.1, eingeführt. In Visual Studio 2017 wurde eingeschränkte Unterstützung /arch:AVX512 hinzugefügt und in Visual Studio 2019 erweitert.

So legen Sie diese Compileroption für AVX, AVX2, AVX512, IA32, SSE oder SSE2 in Visual Studio fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten für das Projekt. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).

  2. Wählen Sie die Eigenschaftenseite Konfigurationseigenschaften>C/C++>Codegenerierung aus.

  3. Ändern Sie die Eigenschaft "Erweiterten Anweisungssatz aktivieren".

So legen Sie diese Compileroption programmgesteuert fest

Siehe auch

/arch (Minimale CPU-Architektur)
MSVC-Compileroptionen
MSVC-Compiler-Befehlszeilensyntax