__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_support
true
如果处理器支持feature
并在avx10_version
运行时返回,则返回;否则返回false
。
__check_arch_support
true
如果/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 专用