__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
は、プロセッサが実行時にfeature
とavx10_version
をサポートしている場合はtrue
を返し、それ以外の場合はfalse
。
__check_arch_support
は、/arch
フラグがコンパイル時にfeature
とavx10_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 固有の仕様はここまで