共用方式為


__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如果處理器在執行時間支援 featureavx10_version ,則傳true回 ,false否則傳回 。 __check_arch_supporttrue如果/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 特定的

另請參閱

編譯器內建函式