다음을 통해 공유


__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 전용 종료

참고 항목

컴파일러 내장 함수