/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
AVX10.1
|AVX512
|AVX2
|||AVX
|SSE
SSE2
]
Argumente
/arch:IA32
Gibt keine erweiterten Anweisungen an, und gibt außerdem x87 für Gleitkommaberechnungen an.
/arch:SSE
Aktiviert Intel Streaming SIMD-Erweiterungen.
/arch:SSE2
Aktiviert Intel Streaming SIMD Extensions 2. Der Standardanweisungssatz ist SSE2, wenn keine /arch
Option angegeben wird.
/arch:AVX
Aktiviert Intel Advanced Vector Extensions.
/arch:AVX2
Aktiviert Intel Advanced Vector Extensions 2.
/arch:AVX512
Aktiviert Intel Advanced Vector Extensions 512.
/arch:AVX10.1
Aktiviert Intel Advanced Vector Extensions 10, Version 1.
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. Sie können auch die __check_isa_support
systeminterne Funktion verwenden, um nach häufiger verwendeten CPU-Funktionen zu suchen.
/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, Maskierung, eingebettetes Runden/Übertragen und neue Anweisungen zulässt. Die Standardvektorlänge beträgtAVX512
512 Bit und kann mit der/vlen
Kennzeichnung auf 256 Bit geändert werden.AVX10.1
fügt weitere Anweisungen oben aufAVX-512
. Die Standardvektorlänge fürAVX10.1
256 Bit und kann mit der/vlen
Kennzeichnung auf 512 Bit geändert werden.
Der Optimierer wählt aus, wann und wie Vektoranweisungen verwendet werden, je nachdem, welches /arch
angegeben ist. Skalare Gleitkommaberechnungen werden in der Regel mit SSE- oder AVX-Anweisungen ausgeführt, wenn verfügbar. 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 zusammen 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 dies 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_FP
, , __AVX__
, __AVX2__
, __AVX512CD__
__AVX512F__
, __AVX512BW__
, __AVX512DQ__
, , __AVX512VL__
, und __AVX10_VER__
Makros geben an, welche, falls vorhanden, /arch
Compileroption verwendet wurde. Weitere Informationen finden Sie unter Vordefinierte Makros. Die /arch:AVX2
Option und __AVX2__
das 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. Unterstützung für /arch:AVX10.1
wurde in Visual Studio 2022 hinzugefügt.
So legen Sie die /arch
Compileroption in Visual Studio fest
Ö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).
Wählen Sie die Eigenschaftenseite Konfigurationseigenschaften>C/C++>Codegenerierung aus.
Ändern Sie die Eigenschaft "Erweiterten Anweisungssatz aktivieren".
So legen Sie diese Compileroption programmgesteuert fest
- Siehe EnableEnhancedInstructionSet.
Siehe auch
/arch
(Minimale CPU-Architektur)
MSVC-Compileroptionen
Syntax für die MSVC-Compilerbefehlszeile