インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

_allow_cpu_features

コード領域が特定の機能をサポートするプロセッサー専用であることをコンパイラーに伝えることで、特定の機能向けに最適化されたコードを生成します。

構文

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 を示します。例えば、次の引数は同じアセンブリー・コードを生成します。

引数は、[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;
}

戻り値

なし。

関連情報