インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
コード領域が特定の機能をサポートするプロセッサー専用であることをコンパイラーに伝えることで、特定の機能向けに最適化されたコードを生成します。
extern void _allow_cpu_features(unsigned __int64); |
unsigned __int64 |
1 つまたは複数の CPUID 機能を表す符号なし __int64 ビット。 _FEATURE_GENERIC_IA32 _FEATURE_FPU _FEATURE_CMOV _FEATURE_MMX _FEATURE_FXSAVE _FEATURE_SSE _FEATURE_SSE2 _FEATURE_SSE3 _FEATURE_SSSE3 _FEATURE_SSE4_1 _FEATURE_SSE4_2 _FEATURE_MOVBE _FEATURE_POPCNT _FEATURE_PCLMULQDQ _FEATURE_AES _FEATURE_F16C _FEATURE_AVX _FEATURE_RDRND _FEATURE_FMA _FEATURE_BMI _FEATURE_LZCNT _FEATURE_HLE _FEATURE_RTM _FEATURE_AVX2 _FEATURE_ADX _FEATURE_RDSEED _FEATURE_AVX512DQ _FEATURE_AVX512F _FEATURE_AVX512ER _FEATURE_AVX512PF _FEATURE_AVX512CD _FEATURE_AVX512BW _FEATURE_AVX512VL _FEATURE_SHA _FEATURE_MPX _FEATURE_AVX512IFMA52 _FEATURE_AVX512VBMI _FEATURE_AVX512_4FMAPS _FEATURE_AVX512_4VNNIW |
この組込み関数により、コード・ブロック・レベルで特定のプロセッサー機能を利用できます。この関数は、関数呼び出しに続くコードの有効範囲にのみ適用されます。コードブロックが特定の機能をサポートするプロセッサーでのみ実行されることを保証する必要があります。特定の機能をサポートしていないプロセッサーで実行すると、不正な命令例外によりプログラムが異常終了することがあります。
関数は、ビットマスクを引数として受け付けます。ある ISA が別の ISA に依存する場合、高位の ISA は通常下位の ISA を示します。例えば、次の引数は同じアセンブリー・コードを生成します。
_FEATURE_SSE2|_FEATURE_AVX|_FEATURE_AVX512F
引数は、[Q]x や -m (Linux* および macOS*) または /arch (Windows*) オプションで指定されたプロセッサー向けに機能を追加することはできますが、機能を削除することはできません。
この関数だけでは、コンパイラーは複数のコードパスを生成しません。そのためには、_may_i_use_cpu_feature() を使用する必要があります。
この関数についての最新情報は、リリースノートを参照してください。
関数レベルで特定のプロセッサー機能を利用するには、cpu_dispatch または cpu_specific 属性、あるいは optimization_parameter プラグマを使用します。
ファイルレベルで指定したプロセッサー機能を使用するには、[Q]x コンパイラー・オプションを使用します。
次の例は、この組込み関数により、プロセッサーのインテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) 機能とインテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2) 機能を使用するコードを生成する方法を示します。
#include <string.h> #include <immintrin.h> #define MAXIMGS 20 #define MAXNAME 512 typedef struct { int x; /* イメージの X 軸のサイズ */ int y; /* イメージの Y 軸のサイズ */ int bpp; /* イメージのビット数 */ char name[MAXNAME]; /* イメージの完全なファイル名 */ unsigned char * data; /* イメージの生データ (バイト) へのポインター */ } rawimage; extern rawimage * imagelist[MAXIMGS]; extern int numimages; rawimage* CreateImage(char * filename) { rawimage* newimage = NULL; int i, len, intable; intable=0; if (numimages!=0) { _allow_cpu_features(_FEATURE_SSE2 | _FEATURE_AVX); for (i=0; i<numimages; i++) { if (!strcmp(filename, imagelist[i]->name)) { newimage=imagelist[i]; intable=1; } } } if (!intable) { newimage=(rawimage *)malloc(sizeof(rawimage)); if (newimage != NULL) { strcpy(newimage->name, filename); imagelist[numimages]=newimage; /* 新しいイメージをテーブルに追加 */ numimages++; /* イメージ数をインクリメント */ } } return newimage; }
なし。