__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