Edit

Share via


__check_isa_support, __check_arch_support

Microsoft Specific

__check_isa_support - detects if the processor supports the specified ISA feature and AVX10 version at run time. __check_arch_support - detects if the arch flag (see /arch (x86), /arch (x64)) supports the specified ISA feature and AVX10 version at compile time.

Syntax

_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
);

Parameters

feature
[in] ISA feature to check.

avx10_version
[in] AVX10 version to check. 0 if AVX10 version check isn't required.

Return value

__check_isa_support returns true if the processor supports feature and avx10_version at run time, false otherwise. __check_arch_support returns true if the /arch flag supports feature and avx10_version at compile time, false otherwise.

Requirements

Intrinsic Architecture
__check_isa_support x86, x64
__check_arch_support x86, x64

Header file <immintrin.h>

Remarks

The __check_isa_support intrinsic provides a faster alternative to the __cpuid intrinsic to dynamically check for most frequently used CPU features. The __check_arch_support intrinsic provides an alternative to the predefined macros for compile time code selection based on ISA extensions.

The following feature values can be used in these intrinsics. These values are defined in isa_availability.h.

Feature Value Name Description
__IA_SUPPORT_VECTOR128 Vector instructions with lengths up to 128 bits. This feature is enabled for SSE2 or later extensions
__IA_SUPPORT_VECTOR256 Vector instructions with lengths up to 256 bits. This feature is enabled for AVX2 or later extensions
__IA_SUPPORT_VECTOR512 Vector instructions with lengths up to 512 bits. This feature is enabled for AVX-512 or later extensions
__IA_SUPPORT_AVX10 AVX10 support. This feature is enabled for AVX10.1 or later extensions
__IA_SUPPORT_SSE42 SSE4.2 support
__IA_SUPPORT_SV128X AVX-512 instructions for scalar of 128 bits. Can be used to signal that certain useful AVX-512 instruction like conversions can be used in scalar code
__IA_SUPPORT_AVX10_2 AVX10.2 support
__IA_SUPPORT_APX APX support
__IA_SUPPORT_FP16 Half-precision floating-point instruction support

Multiple feature values can be combined using the OR(|) operator.

The __check_arch_support intrinsic can always be evaluated at compile time, so using it in optimized code adds no extra instructions to execute. Support for these intrinsics was added in Visual Studio 2022 version 17.10.

Example

This example uses 256-bit AVX-512 instructions to vectorize conversion of double-precision values to 64-bit signed integer values. The tail loop for converting any source values not handled by the vector code is also used in case the vector code can't be executed. The compile-time support is checked before runtime support so that a runtime check can be avoided if possible.

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

See also

Compiler intrinsics