/arch
(x86)
Specifica l'architettura per la generazione del codice su piattaforme x86. Per altre informazioni su altre architetture di destinazione, vedere (ARM64), (x64) e (ARM).For more information on /arch
for other target architectures, see /arch
(ARM64), /arch
(x64), and /arch
(ARM).
Sintassi
/arch:
[IA32
AVX10.1
|AVX512
|AVX2
|||AVX
|SSE
SSE2
]
Argomenti
/arch:IA32
Non specifica istruzioni avanzate e specifica x87 per i calcoli a virgola mobile.
/arch:SSE
Abilita le estensioni SIMD di Intel Streaming.
/arch:SSE2
Abilita le estensioni SIMD di Intel Streaming 2. Il set di istruzioni predefinito è SSE2 se non viene specificata alcuna /arch
opzione.
/arch:AVX
Abilita Le estensioni vettoriali avanzate Intel.
/arch:AVX2
Abilita Intel Advanced Vector Extensions 2.
/arch:AVX512
Abilita Intel Advanced Vector Extensions 512.
/arch:AVX10.1
Abilita Intel Advanced Vector Extensions 10 versione 1.
Osservazioni:
L'opzione /arch
abilita o disabilita l'uso di determinate estensioni del set di istruzioni, in particolare per il calcolo vettoriale, disponibile nei processori intel e AMD. In generale, i processori introdotti più di recente possono supportare estensioni oltre quelle supportate dai processori meno recenti. È consigliabile consultare la documentazione relativa a un particolare processore o test per il supporto dell'estensione del set di istruzioni usando __cpuid
prima di eseguire il codice usando un'estensione del set di istruzioni. È anche possibile usare l'intrinseco __check_isa_support
per verificare la presenza di funzionalità della CPU usate più di frequente.
/arch
influisce solo sulla generazione del codice per le funzioni native. Quando si usa /clr
per la compilazione, /arch
non ha alcun effetto sulla generazione di codice per le funzioni gestite.
Le /arch
opzioni fanno riferimento alle estensioni del set di istruzioni con le caratteristiche seguenti:
IA32
è l'istruzione x86 a 32 bit legacy senza operazioni vettoriali e l'uso di x87 per i calcoli a virgola mobile.SSE
consente il calcolo con vettori fino a quattro valori a virgola mobile e precisione singola. Sono state aggiunte anche le istruzioni scalari a virgola mobile corrispondenti.SSE2
consente il calcolo con vettori a 128 bit di valori integer a precisione singola, precisione doppia e 1, 2, 4 o integer a 8 byte. Sono state aggiunte anche istruzioni scalari a precisione doppia.AVX
è stata introdotta una codifica di istruzioni alternative per istruzioni scalari vettoriali e a virgola mobile. Consente vettori di 128 bit o 256 bit ed estende tutti i risultati del vettore alla dimensione del vettore completa. Per la compatibilità legacy, le istruzioni del vettore in stile SSE mantengono tutti i bit oltre il bit 127. La maggior parte delle operazioni a virgola mobile viene estesa a 256 bit.AVX2
estende la maggior parte delle operazioni integer a vettori a 256 bit e consente l'uso delle istruzioni Fused Multiply-Add (FMA).AVX512
ha introdotto un altro modulo di codifica delle istruzioni che consente vettori a 512 bit, mascheramento, arrotondamento/trasmissione incorporati e nuove istruzioni. La lunghezza del vettore predefinita perAVX512
è 512 bit e può essere modificata in 256 bit usando il/vlen
flag .AVX10.1
aggiunge altre istruzioni all'inizio diAVX-512
. La lunghezza del vettore predefinita perAVX10.1
è di 256 bit e può essere modificata in 512 bit usando il/vlen
flag .
L'utilità di ottimizzazione sceglie quando e come usare le istruzioni vettoriali in base a quanto /arch
specificato. I calcoli a virgola mobile scalari vengono in genere eseguiti con istruzioni SSE o AVX, se disponibili. Alcune convenzioni di chiamata specificano il passaggio di argomenti a virgola mobile nello stack x87 e, di conseguenza, il codice può usare una combinazione di istruzioni x87 e SSE/AVX per i calcoli a virgola mobile. Le istruzioni del vettore integer possono essere usate anche per alcune operazioni integer a 64 bit, se disponibili.
Oltre alle istruzioni scalari a virgola mobile e vettoriale, ogni /arch
opzione può anche abilitare l'uso di altre istruzioni non vettoriali associate a tale opzione. Un esempio è la famiglia di istruzioni CMOVcc che è apparsa per la prima volta sui processori Intel Pentium Pro. Poiché le istruzioni SSE sono state introdotte con il processore Intel Pentium III successivo, le istruzioni CMOVcc possono essere generate tranne quando /arch:IA32
viene specificato.
Le operazioni a virgola mobile vengono in genere arrotondate a precisione doppia (64 bit) nel codice x87, ma è possibile usare _controlfp
per modificare la parola di controllo FP, inclusa l'impostazione del controllo precisione su precisione estesa (80 bit) o precisione singola (a 32 bit). Per altre informazioni, vedere , , __control87_2
_controlfp
._control87
SSE e AVX dispongono di istruzioni separate a precisione singola e a precisione doppia per ogni operazione, quindi non esiste un equivalente per il codice SSE/AVX. Può modificare il modo in cui i risultati vengono arrotondati quando il risultato di un'operazione a virgola mobile viene usato direttamente in un ulteriore calcolo anziché assegnarlo a una variabile utente. Considerare le operazioni seguenti:
r = f1 * f2 + d; // Different results are possible on SSE/SSE2.
Con assegnazione esplicita:
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
e /QIfist
non possono essere usati insieme. L'opzione /QIfist
modifica il comportamento di arrotondamento della conversione a virgola mobile in integer. Il comportamento predefinito consiste nel troncamento (arrotondamento verso zero), mentre l'opzione /QIfist
specifica l'uso della modalità di arrotondamento dell'ambiente a virgola mobile. Poiché l'opzione modifica il comportamento di tutte le conversioni a virgola mobile in integer, /QIfist
è deprecato. Durante la compilazione per SSE o AVX, è possibile arrotondare un valore a virgola mobile a un intero usando la modalità di arrotondamento dell'ambiente a virgola mobile usando una sequenza di funzioni intrinseche:
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));
}
Le _M_IX86_FP
macro , __AVX2__
__AVX__
, __AVX512F__
__AVX512DQ__
__AVX512BW__
__AVX512VL__
__AVX512CD__
e __AVX10_VER__
indicano quale opzione del compilatore, se presente, /arch
è stata usata. Per altre informazioni, vedere Macro predefinite. L'opzione /arch:AVX2
e __AVX2__
la macro sono state introdotte in Visual Studio 2013 Update 2, versione 12.0.34567.1. È stato aggiunto un supporto limitato per /arch:AVX512
in Visual Studio 2017 ed è stato espanso in Visual Studio 2019. Il supporto per /arch:AVX10.1
è stato aggiunto in Visual Studio 2022.
Per impostare l'opzione del /arch
compilatore in Visual Studio
Aprire la finestra di dialogo Pagine delle proprietà per il progetto. Per altre informazioni, vedere Impostare il compilatore e le proprietà di compilazione.
Selezionare la pagina delle proprietà Proprietà>di configurazione C/C++>Generazione codice.
Modificare la proprietà Enable Enhanced Instruction Set .
Per impostare l'opzione del compilatore a livello di codice
- Vedere EnableEnhancedInstructionSet.
Vedi anche
/arch
(Architettura cpu minima)
Opzioni del compilatore MSVC
Sintassi della riga di comando del compilatore MSVC