__check_isa_support, __check_arch_support
Microsoft 전용
__check_isa_support
- 프로세서가 런타임에 지정된 ISA 기능 및 AVX10 버전을 지원하는지 검색합니다.
__check_arch_support
- 아치 플래그(참조 /arch
(x86), /arch
(x64))가 컴파일 시간에 지정된 ISA 기능 및 AVX10 버전을 지원하는지 검색합니다.
구문
_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
);
매개 변수
기능
[in] 확인할 ISA 기능입니다.
avx10_version
[in] 확인할 AVX10 버전입니다. AVX10 버전 검사가 필요하지 않은 경우 0입니다.
반환 값
__check_isa_support
는 프로세서가 지원하는 경우, avx10_version
그렇지 않으면 런타임 false
에 반환 true
됩니다feature
.
__check_arch_support
은 플래그가 /arch
지원되면 반환하고 컴파일 false
시간에 반환합니다avx10_version
. 그렇지 않으면 반환 true
됩니다feature
.
요구 사항
Intrinsic | 아키텍처 |
---|---|
__check_isa_support |
x86, x64 |
__check_arch_support |
x86, x64 |
헤더 파일 <immintrin.h>
설명
내장 함수는 __check_isa_support
가장 자주 사용되는 CPU 기능을 동적으로 확인하기 위해 내장 함수에 대한 더 빠른 대안을 __cpuid
제공합니다. 내장 함수는 __check_arch_support
ISA 확장을 기반으로 컴파일 시간 코드 선택에 대한 대안을 predefined macros
제공합니다.
다음 기능 값은 이러한 내장 함수에서 사용할 수 있습니다. 이러한 값은 .에 정의되어 있습니다 isa_availability.h
.
기능 값 이름 | 설명 |
---|---|
__IA_SUPPORT_VECTOR128 |
길이가 최대 128비트인 벡터 명령입니다. 이 기능은 SSE2 이상 확장에 대해 사용하도록 설정됩니다. |
__IA_SUPPORT_VECTOR256 |
길이가 최대 256비트인 벡터 명령입니다. 이 기능은 AVX2 이상 확장에 대해 사용하도록 설정됩니다. |
__IA_SUPPORT_VECTOR512 |
길이가 최대 512비트인 벡터 명령입니다. 이 기능은 AVX-512 이상 확장에 대해 사용하도록 설정됩니다. |
__IA_SUPPORT_AVX10 |
AVX10 지원. 이 기능은 AVX10.1 이상 확장에 사용할 수 있습니다. |
__IA_SUPPORT_SSE42 |
SSE4.2 지원 |
__IA_SUPPORT_SV128X |
128비트 스칼라에 대한 AVX-512 지침입니다. 변환과 같은 특정 유용한 AVX-512 명령을 스칼라 코드에서 사용할 수 있음을 알리는 데 사용할 수 있습니다. |
__IA_SUPPORT_AVX10_2 |
AVX10.2 지원 |
__IA_SUPPORT_APX |
APX 지원 |
__IA_SUPPORT_FP16 |
반정밀도 부동 소수점 명령 지원 |
OR(|) 연산자를 사용하여 여러 기능 값을 결합할 수 있습니다.
내장 함수는 __check_arch_support
컴파일 시간에 항상 평가할 수 있으므로 최적화된 코드에서 사용하면 실행할 추가 지침이 추가되지 않습니다.
이러한 내장 함수에 대한 지원이 Visual Studio 2022 버전 17.10에 추가되었습니다.
예시
이 예제에서는 256비트 AVX-512 지침을 사용하여 배정밀도 값을 64비트 부속 정수 값으로 변환하는 벡터화합니다. 벡터 코드에서 처리되지 않는 소스 값을 변환하기 위한 비상 루프는 벡터 코드를 실행할 수 없는 경우에도 사용됩니다. 가능한 경우 런타임 검사를 방지할 수 있도록 런타임 지원 전에 컴파일 시간 지원을 확인합니다.
// 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
Microsoft 전용 종료