インテル® C++ コンパイラー 17.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_KNCNI _FEATURE_ADX _FEATURE_RDSEED |
この組込み関数により、コード・ブロック・レベルで特定のプロセッサー機能を利用できます。この関数は、関数呼び出しに続くコードの有効範囲にのみ適用されます。コードブロックが特定の機能をサポートするプロセッサーでのみ実行されることを保証する必要があります。特定の機能をサポートしていないプロセッサーで実行すると、不正な命令例外によりプログラムが異常終了することがあります。
関数レベルで特定のプロセッサー機能を利用するには、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_featured(_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; }
なし。