Udostępnij za pośrednictwem


__check_isa_support, __check_arch_support

Specyficzne dla firmy Microsoft

__check_isa_support — wykrywa, czy procesor obsługuje określoną funkcję ISA i wersję AVX10 w czasie wykonywania. __check_arch_support— wykrywa, czy flaga arch (patrz /arch (x86), /arch (x64)) obsługuje określoną funkcję ISA i wersję AVX10 w czasie kompilacji.

Składnia

_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

cecha
[in] Funkcja ISA do sprawdzenia.

avx10_version
[in] Wersja AVX10 do sprawdzenia. 0, jeśli sprawdzanie wersji AVX10 nie jest wymagane.

Wartość zwracana

__check_isa_support zwraca wartość true , jeśli procesor obsługuje feature i avx10_version w czasie wykonywania, false w przeciwnym razie. __check_arch_support Zwraca true wartość , jeśli flaga /arch obsługuje feature funkcję i avx10_version w czasie kompilacji, false w przeciwnym razie.

Wymagania

Nieodłączny Architektura
__check_isa_support x86, x64
__check_arch_support x86, x64

Plik nagłówka <immintrin.h>

Uwagi

Funkcja wewnętrzna __check_isa_support zapewnia szybszą alternatywę dla __cpuid funkcji wewnętrznych w celu dynamicznego sprawdzania najczęściej używanych funkcji procesora CPU. Funkcja wewnętrzna __check_arch_support stanowi alternatywę dla predefined macros wyboru kodu czasu kompilacji na podstawie rozszerzeń ISA.

Następujące wartości funkcji mogą być używane w tych funkcjach wewnętrznych. Te wartości są definiowane w pliku isa_availability.h.

Nazwa wartości funkcji opis
__IA_SUPPORT_VECTOR128 Instrukcje wektorowe o długości do 128 bitów. Ta funkcja jest włączona dla rozszerzeń SSE2 lub nowszych
__IA_SUPPORT_VECTOR256 Instrukcje wektorów o długości do 256 bitów. Ta funkcja jest włączona dla rozszerzeń AVX2 lub nowszych
__IA_SUPPORT_VECTOR512 Instrukcje wektorowe o długości do 512 bitów. Ta funkcja jest włączona dla rozszerzeń AVX-512 lub nowszych
__IA_SUPPORT_AVX10 Obsługa formatu AVX10. Ta funkcja jest włączona dla rozszerzeń AVX10.1 lub nowszych
__IA_SUPPORT_SSE42 Obsługa protokołu SSE4.2
__IA_SUPPORT_SV128X AvX-512 instrukcje dotyczące skalarnego 128 bitów. Może służyć do sygnalizatora, że niektóre przydatne instrukcje AVX-512, takie jak konwersje, mogą być używane w kodzie skalarnym
__IA_SUPPORT_AVX10_2 Obsługa avX10.2
__IA_SUPPORT_APX Obsługa środowiska APX
__IA_SUPPORT_FP16 Obsługa instrukcji zmiennoprzecinkowych o połowie precyzji

Wiele wartości funkcji można łączyć przy użyciu operatora OR(|).

Funkcja wewnętrzna __check_arch_support zawsze może być oceniana w czasie kompilacji, więc użycie jej w zoptymalizowanym kodzie nie dodaje dodatkowych instrukcji do wykonania. Dodano obsługę tych funkcji wewnętrznych w programie Visual Studio 2022 w wersji 17.10.

Przykład

W tym przykładzie użyto 256-bitowych instrukcji AVX-512, aby wektoryzować konwersję wartości o podwójnej precyzji do 64-bitowych wartości całkowitych ze znakiem. Pętla ogona służąca do konwertowania wszystkich wartości źródłowych, które nie są obsługiwane przez kod wektorowy, jest również używana w przypadku, gdy nie można wykonać kodu wektorowego. Obsługa czasu kompilacji jest sprawdzana przed obsługą środowiska uruchomieniowego, aby w miarę możliwości można było uniknąć sprawdzania środowiska uruchomieniowego.

// 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

Zobacz też

Funkcje wewnętrzne kompilatora