__check_isa_support, __check_arch_support
Specifické pro Microsoft
__check_isa_support
– zjistí, jestli procesor podporuje zadanou funkci ISA a verzi AVX10 za běhu.
__check_arch_support
– zjistí, jestli příznak archu (viz /arch
(x86), /arch
(x64)) podporuje zadanou funkci ISA a verzi AVX10 v době kompilace.
Syntaxe
_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
);
Parametry
rys
[v] Funkce ISA, která se má zkontrolovat.
avx10_version
[v] Kontrola verze AVX10 0, pokud kontrola verze AVX10 není nutná.
Vrácená hodnota
__check_isa_support
vrátí true
, pokud procesor podporuje feature
a avx10_version
za běhu, false
jinak.
__check_arch_support
vrátí true
, pokud /arch
příznak podporuje feature
a avx10_version
v době kompilace, false
jinak.
Požadavky
Vnitřní | Architektura |
---|---|
__check_isa_support |
x86, x64 |
__check_arch_support |
x86, x64 |
Hlavičkový soubor <immintrin.h>
Poznámky
Vnitřní __check_isa_support
funkce poskytuje rychlejší alternativu __cpuid
k vnitřní funkci, která dynamicky kontroluje nejčastěji používané funkce procesoru. Vnitřní __check_arch_support
funkce poskytuje alternativu predefined macros
k výběru kódu pro kompilaci na základě rozšíření ISA.
V těchto vnitřních objektech lze použít následující hodnoty funkcí. Tyto hodnoty jsou definovány v isa_availability.h
.
Název hodnoty funkce | Popis |
---|---|
__IA_SUPPORT_VECTOR128 |
Vektorové instrukce o délce až 128 bitů. Tato funkce je povolená pro rozšíření SSE2 nebo novější. |
__IA_SUPPORT_VECTOR256 |
Vektorové instrukce s délkou až 256 bitů. Tato funkce je povolená pro rozšíření AVX2 nebo novější. |
__IA_SUPPORT_VECTOR512 |
Vektorové instrukce s délkou až 512 bitů. Tato funkce je povolená pro rozšíření AVX-512 nebo novější. |
__IA_SUPPORT_AVX10 |
Podpora AVX10. Tato funkce je povolená pro rozšíření AVX10.1 nebo novější. |
__IA_SUPPORT_SSE42 |
Podpora SSE4.2 |
__IA_SUPPORT_SV128X |
POKYNY AVX-512 pro skalár 128 bitů. Lze použít k signalizaci, že určité užitečné instrukce AVX-512, jako jsou převody, lze použít ve skalárním kódu. |
__IA_SUPPORT_AVX10_2 |
Podpora AVX10.2 |
__IA_SUPPORT_APX |
Podpora APX |
__IA_SUPPORT_FP16 |
Podpora instrukcí s plovoucí desetinnou čárkou s poloviční přesností |
Pomocí operátoru OR(|) lze kombinovat více hodnot funkcí.
Vnitřní __check_arch_support
objekt lze vždy vyhodnotit v době kompilace, takže jeho použití v optimalizovaném kódu nepřidá žádné další pokyny ke spuštění.
Podpora těchto vnitřních objektů byla přidána v sadě Visual Studio 2022 verze 17.10.
Příklad
Tento příklad používá 256bitové instrukce AVX-512 k vektorizaci převodu hodnot dvojité přesnosti na 64bitové celočíselné hodnoty. Koncová smyčka pro převod všech zdrojových hodnot nezpracovaných vektorovým kódem se používá také pro případ, že vektorový kód nelze spustit. Podpora doby kompilace se kontroluje před podporou modulu runtime, aby se v případě potřeby zabránilo kontrole modulu runtime.
// 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
END Microsoft Specific