Freigeben über


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

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.

/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ägt AVX512 512 Bit und kann mit der /vlen Kennzeichnung auf 256 Bit geändert werden.

  • AVX10.1 fügt weitere Anweisungen oben auf AVX-512. Die Standardvektorlänge für AVX10.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

  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
Syntax für die MSVC-Compilerbefehlszeile