Sdílet prostřednictvím


__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

Viz také

Vnitřní funkce kompilátoru