/arch
(x86)
Spécifie l'architecture pour la génération de code sur x86. Pour plus d’informations sur /arch
les autres architectures cibles, consultez /arch
(ARM64), /arch
(x64) et /arch
(ARM).
Syntaxe
/arch:
[IA32
AVX10.1
|AVX512
|AVX2
|||AVX
|SSE
SSE2
]
Arguments
/arch:IA32
Ne spécifie aucune instruction améliorée et spécifie x87 pour les calculs à virgule flottante.
/arch:SSE
Active les extensions SIMD Intel Streaming.
/arch:SSE2
Active les extensions SIMD Intel Streaming 2. Le jeu d’instructions par défaut est SSE2 si aucune option n’est /arch
spécifiée.
/arch:AVX
Active les extensions de vecteurs avancées Intel.
/arch:AVX2
Active Intel Advanced Vector Extensions 2.
/arch:AVX512
Active Intel Advanced Vector Extensions 512.
/arch:AVX10.1
Active Intel Advanced Vector Extensions 10 version 1.
Notes
L’option /arch
active ou désactive l’utilisation de certaines extensions de jeu d’instructions, en particulier pour le calcul vectoriel, disponible dans les processeurs d’Intel et AMD. En général, les processeurs introduits plus récemment peuvent prendre en charge des extensions au-delà de celles prises en charge par les processeurs plus anciens. Vous devez consulter la documentation d’un processeur particulier ou tester la prise en charge de l’extension du jeu d’instructions à l’aide __cpuid
de l’exécution du code à l’aide d’une extension de jeu d’instructions. Vous pouvez également utiliser l’intrinsèque __check_isa_support
pour rechercher les fonctionnalités processeur plus fréquemment utilisées.
/arch
affecte uniquement la génération de code pour les fonctions natives. Lorsque vous utilisez /clr
pour compiler, /arch
n’a aucun effet sur la génération de code pour les fonctions managées.
Les /arch
options font référence aux extensions de jeu d’instructions avec les caractéristiques suivantes :
IA32
est l’ensemble d’instructions x86 32 bits héritée sans opérations vectorielles et l’utilisation de x87 pour les calculs à virgule flottante.SSE
permet le calcul avec des vecteurs allant jusqu’à quatre valeurs à virgule flottante simple précision. Les instructions scalaires correspondantes à virgule flottante ont également été ajoutées.SSE2
permet le calcul avec des vecteurs 128 bits de valeurs entières à précision unique, double précision et 1, 2, 4 ou 8 octets. Des instructions scalaires à double précision ont également été ajoutées.AVX
a introduit un autre encodage d’instructions pour les instructions scalaires à virgule flottante et vectorielle. Il autorise les vecteurs de 128 bits ou de 256 bits, et zéro étend tous les résultats de vecteur à la taille complète du vecteur. (Pour la compatibilité héritée, les instructions vectorielles de style SSE conservent tous les bits au-delà du bit 127.) La plupart des opérations à virgule flottante sont étendues à 256 bits.AVX2
étend la plupart des opérations entières à des vecteurs 256 bits et permet d’utiliser des instructions FMA (Fused Multiply-Add).AVX512
a introduit un autre formulaire d’encodage d’instructions qui autorise les vecteurs 512 bits, le masquage, l’arrondi incorporé/diffusion et de nouvelles instructions. La longueur du vecteur par défaut estAVX512
de 512 bits et peut être modifiée en 256 bits à l’aide de l’indicateur/vlen
.AVX10.1
ajoute d’autres instructions en plus deAVX-512
. La longueur du vecteur par défaut estAVX10.1
de 256 bits et peut être modifiée en 512 bits à l’aide de l’indicateur/vlen
.
L’optimiseur choisit quand et comment utiliser des instructions vectorielles en fonction de ce qui /arch
est spécifié. Les calculs à virgule flottante scalaire sont généralement effectués avec des instructions SSE ou AVX lorsqu’elles sont disponibles. Certaines conventions d’appel spécifient le passage d’arguments à virgule flottante sur la pile x87 et, par conséquent, votre code peut utiliser un mélange d’instructions x87 et SSE/AVX pour les calculs à virgule flottante. Les instructions de vecteur entier peuvent également être utilisées pour certaines opérations entières 64 bits lorsqu’elles sont disponibles.
Outre les instructions scalaires vectorielles et à virgule flottante, chaque /arch
option peut également activer l’utilisation d’autres instructions non vectorielles associées à cette option. Par exemple, la famille d’instructions CMOVcc qui est apparue pour la première fois sur les processeurs Intel Xeonum Pro. Étant donné que les instructions SSE ont été introduites avec le processeur Intel Xeonum III suivant, les instructions CMOVcc peuvent être générées, sauf lorsqu’elles /arch:IA32
sont spécifiées.
Les opérations à virgule flottante sont normalement arrondies à une double précision (64 bits) dans du code x87, mais vous pouvez utiliser _controlfp
pour modifier le mot de contrôle FP, notamment définir le contrôle de précision sur une précision étendue (80 bits) ou une seule précision (32 bits). Pour plus d’informations, consultez _control87
, . __control87_2
_controlfp
SSE et AVX ont des instructions distinctes à précision unique et double précision pour chaque opération. Il n’existe donc aucun équivalent pour le code SSE/AVX. Il peut modifier la façon dont les résultats sont arrondis lorsque le résultat d’une opération à virgule flottante est utilisé directement dans un calcul supplémentaire au lieu de l’affecter à une variable utilisateur. Tenez compte des opérations suivantes :
r = f1 * f2 + d; // Different results are possible on SSE/SSE2.
Avec une affectation explicite :
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
et /QIfist
ne peut pas être utilisé ensemble. L’option /QIfist
modifie le comportement d’arrondi de la conversion à virgule flottante en conversion entière. Le comportement par défaut consiste à tronquer (arrondi à zéro), tandis que l’option spécifie l’utilisation /QIfist
du mode d’arrondi de l’environnement à virgule flottante. Étant donné que l’option modifie le comportement de toutes les conversions à virgule flottante en conversions entières, /QIfist
est déconseillée. Lors de la compilation pour SSE ou AVX, vous pouvez arrondir une valeur à virgule flottante à un entier à l’aide du mode d’arrondi de l’environnement à virgule flottante à l’aide d’une séquence de fonctions intrinsèque :
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));
}
Les _M_IX86_FP
macros , __AVX512F__
__AVX512BW__
__AVX2__
__AVX__
__AVX512DQ__
__AVX512VL__
__AVX512CD__
__AVX10_VER__
le cas échéant, /arch
indiquent quelle option du compilateur a été utilisée. Pour plus d’informations, consultez Macros prédéfinies. L’option /arch:AVX2
et __AVX2__
la macro ont été introduites dans Visual Studio 2013 Update 2, version 12.0.34567.1. La prise en charge limitée de /arch:AVX512
Visual Studio 2017 a été ajoutée et développée dans Visual Studio 2019. La prise en charge a /arch:AVX10.1
été ajoutée dans Visual Studio 2022.
Pour définir l’option du /arch
compilateur dans Visual Studio
Ouvrez la boîte de dialogue Pages de propriétés du projet. Pour plus d’informations, consultez Définir le compilateur C++ et les propriétés de build dans Visual Studio.
Sélectionnez la page de propriétés De configuration>C/C++>Génération de code.
Modifiez la propriété Enable Enhanced Instruction Set .
Pour définir cette option du compilateur par programmation
- Consultez EnableEnhancedInstructionSet.
Voir aussi
/arch
(Architecture processeur minimale)
Options du compilateur MSVC
Syntaxe de ligne de commande du compilateur MSVC