__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
如果處理器在執行時間支援 feature
和 avx10_version
,則傳true
回 ,false
否則傳回 。
__check_arch_support
true
如果/arch
旗標支援 feature
並在avx10_version
編譯時期傳回 ,false
否則會傳回 。
需求
內建 | 架構 |
---|---|
__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
END Microsoft 特定的