__check_isa_support,__check_arch_support

Microsoft 专用

__check_isa_support - 检测处理器是否在运行时支持指定的 ISA 功能和 AVX10 版本。 __check_arch_support - 检测拱门标志(请参阅(x86 /arch/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
);

参数

feature
[in]要检查的 ISA 功能。

avx10_version
[in]要检查的 AVX10 版本。 如果不需要 AVX10 版本检查,则为 0。

返回值

__check_isa_supporttrue如果处理器支持feature并在avx10_version运行时返回,则返回;否则返回false__check_arch_supporttrue如果/arch标志支持feature并在avx10_version编译时返回,false否则返回。

要求

Intrinsic 体系结构
__check_isa_support x86、x64
__check_arch_support x86、x64

头文件 <immintrin.h>

注解

内部 __check_isa_support 函数为内部函数提供了更快的替代 __cpuid 方法,用于动态检查最常用的 CPU 功能。 内部 __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 专用

另请参阅

编译器内部函数