次の方法で共有


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

パラメーター

feature
[in]チェックする ISA 機能。

avx10_version
[in]確認する AVX10 バージョン。 AVX10 バージョン チェックが必要ない場合は 0。

戻り値

__check_isa_supportは、プロセッサが実行時にfeatureavx10_versionをサポートしている場合はtrueを返し、それ以外の場合はfalse__check_arch_supportは、/arch フラグがコンパイル時にfeatureavx10_versionをサポートする場合はtrueを返します。それ以外の場合はfalse

要件

Intrinsic Architecture
__check_isa_support x86、x64
__check_arch_support x86、x64

ヘッダー ファイル <immintrin.h>

解説

__check_isa_support組み込み関数を使用すると、最も頻繁に使用される CPU 機能を動的にチェックする__cpuid組み込みの代替手段が高速になります。 __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 固有の仕様はここまで

関連項目

コンパイラの組み込み