__check_isa_support, __check_arch_support
Sezione specifica Microsoft
__check_isa_support
: rileva se il processore supporta la funzionalità ISA specificata e la versione AVX10 in fase di esecuzione.
__check_arch_support
- rileva se il flag arch (vedere /arch
(x86), /arch
(x64)) supporta la funzionalità ISA specificata e la versione AVX10 in fase di compilazione.
Sintassi
_Bool __check_isa_support(
unsigned feature,
unsigned avx10_version
);
_Bool __check_arch_support(
unsigned feature,
unsigned avx10_version
);
bool __check_isa_support(
unsigned feature,
unsigned avx10_version
);
bool __check_arch_support(
unsigned feature,
unsigned avx10_version
);
Parametri
feature
[in] Funzionalità ISA da controllare.
avx10_version
[in] Versione di AVX10 da controllare. 0 se il controllo della versione di AVX10 non è obbligatorio.
Valore restituito
__check_isa_support
restituisce true
se il processore supporta feature
e avx10_version
in fase di esecuzione; in caso contrario, false
.
__check_arch_support
restituisce true
se il /arch
flag supporta feature
e avx10_version
in fase di compilazione; in caso contrario, false
.
Requisiti
Intrinsic | Architettura |
---|---|
__check_isa_support |
x86, x64 |
__check_arch_support |
x86, x64 |
File di intestazione <immintrin.h>
Osservazioni:
L'intrinseco __check_isa_support
offre un'alternativa più veloce all'intrinseco __cpuid
per controllare in modo dinamico le funzionalità della CPU usate più di frequente. L'intrinseco __check_arch_support
fornisce un'alternativa alla predefined macros
selezione del codice in fase di compilazione in base alle estensioni ISA.
In questi oggetti intrinseci è possibile usare i valori di funzionalità seguenti. Questi valori sono definiti in isa_availability.h
.
Nome valore funzionalità | Descrizione |
---|---|
__IA_SUPPORT_VECTOR128 |
Istruzioni vettoriali con lunghezze fino a 128 bit. Questa funzionalità è abilitata per le estensioni SSE2 o successive |
__IA_SUPPORT_VECTOR256 |
Istruzioni vettoriali con lunghezze fino a 256 bit. Questa funzionalità è abilitata per le estensioni AVX2 o successive |
__IA_SUPPORT_VECTOR512 |
Istruzioni vettoriali con lunghezze fino a 512 bit. Questa funzionalità è abilitata per le estensioni AVX-512 o successive |
__IA_SUPPORT_AVX10 |
Supporto di AVX10. Questa funzionalità è abilitata per le estensioni AVX10.1 o successive |
__IA_SUPPORT_SSE42 |
Supporto di SSE4.2 |
__IA_SUPPORT_SV128X |
Istruzioni AVX-512 per scalare di 128 bit. Può essere usato per segnalare che alcune istruzioni AVX-512 utili come le conversioni possono essere usate nel codice scalare |
__IA_SUPPORT_AVX10_2 |
Supporto di AVX10.2 |
__IA_SUPPORT_APX |
Supporto APX |
__IA_SUPPORT_FP16 |
Supporto delle istruzioni a virgola mobile a metà precisione |
È possibile combinare più valori di funzionalità usando l'operatore OR(|).
L'intrinseco __check_arch_support
può sempre essere valutato in fase di compilazione, quindi l'uso nel codice ottimizzato non aggiunge istruzioni aggiuntive da eseguire.
Il supporto per questi intrinseci è stato aggiunto in Visual Studio 2022 versione 17.10.
Esempio
Questo esempio usa istruzioni AVX-512 a 256 bit per vettorizzare la conversione di valori con precisione doppia in valori integer con segno a 64 bit. Il ciclo tail per la conversione di qualsiasi valore di origine non gestito dal codice vettoriale viene usato anche nel caso in cui il codice vettoriale non possa essere eseguito. Il supporto in fase di compilazione viene controllato prima del supporto del runtime in modo che un controllo di runtime possa essere evitato, se possibile.
// Compile this test with: /EHsc /O2
#include <iostream>
#include <vector>
#include <immintrin.h>
#include <isa_availability.h>
using namespace std;
#define CHECK_INSTRUCTION_SUPPORT(a,v) \
(__check_arch_support((a),(v)) || __check_isa_support((a),(v)))
int main()
{
vector<double> input = {0.3, 1.4, 2.5, 3.6, 4.7, 5.8, 6.9, 8.0, 9.1, 11.14};
vector<__int64> output(10, 0);
int i = 0;
if (CHECK_INSTRUCTION_SUPPORT(__IA_SUPPORT_SV128X | __IA_SUPPORT_VECTOR256, 0))
{
for (; i < input.size() - 4; i += 4)
{
__m256i values = _mm256_cvttpd_epi64(_mm256_load_pd(&input[i]));
_mm256_storeu_epi64((void*)&output[i], values);
}
}
for (; i < input.size(); i++)
{
output[i] = input[i];
}
for (i = 0; i < output.size(); i++) {
cout << "output[" << i << "] = " << output[i] << endl;
}
}
output[0] = 0
output[1] = 1
output[2] = 2
output[3] = 3
output[4] = 4
output[5] = 5
output[6] = 6
output[7] = 8
output[8] = 9
output[9] = 11
Fine sezione specifica Microsoft