インテル® C++ コンパイラー 15.0 ユーザー・リファレンス・ガイド

手動でターゲット・プロセッサーを指定する

手動プロセッサー・ディスパッチ機能を使用すると、手動でターゲット・プロセッサーを指定できます。プロセッサー・ディスパッチを制御する方法はいくつかあります。

手動プロセッサー・ディスパッチのプログラミングでの cpu_dispatch の使用

コードで __declspec(cpu_dispatch(cpuid, cpuid,...)) 構文を使用すると、ターゲット・プロセッサーのリストと空の関数本体/関数スタブを提供できます。 __declspec(cpu_specific(cpuid)) を使用すると、各関数のプロセッサー固有バージョンを宣言できます。

次の表は、cpuid の値を列挙したものです。

cpuid の値

プロセッサー

core_4th_gen_avx_tsx

インテル® トランザクショナル・シンクロナイゼーション・エクステンション (インテル® TSX) および RDRND 命令を含むインテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) 対応第 4 世代インテル® Core™ プロセッサー・ファミリー

core_4th_gen_avx

RDRND 命令を含むインテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) 対応第 4 世代インテル® Core™ プロセッサー・ファミリー

core_3rd_gen_avx

RDRND 命令を含むインテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) 対応第 3 世代インテル® Core™ プロセッサー・ファミリー

core_2nd_gen_avx

インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) 対応第 2 世代インテル® Core™ プロセッサー・ファミリー

core_aes_pclmulqdq

AES (Advanced Encryption Standard) 命令およびキャリーなし乗算命令対応インテル® Core™ プロセッサー

core_i7_sse4_2

インテル® ストリーミング SIMD 拡張命令 4.2 (SSE4.2) 対応インテル® Core™ i7 プロセッサー

core_2_duo_sse4_1

インテル® ストリーミング SIMD 拡張命令 4.1 (SSE4.1) 対応インテル® 45nm Hi-k 次世代インテル® Core™ プロセッサー

core_2_duo_ssse3

インテル® Core™2 Duo プロセッサーおよびインテル® ストリーミング SIMD 拡張命令 3 補足命令 (インテル® SSSE3) 対応インテル® Xeon® プロセッサー

atom

インテル® ストリーミング SIMD 拡張命令 3 補足命令 (インテル® SSSE3) 対応インテル® Atom™ プロセッサー

pentium_4_sse3

インテル® ストリーミング SIMD 拡張命令 3 (SSE3) 対応インテル® Pentium® 4 プロセッサー、インテル® Core™ Duo プロセッサー、インテル® Core™ Solo プロセッサー

pentium_4

インテル® Pentium® 4 プロセッサー

pentium_m

インテル® Pentium® M プロセッサー

pentium_iii

インテル® Pentium® III プロセッサー

generic

インテル製のその他の IA-32 またはインテル® 64 プロセッサーまたは互換プロセッサー

一致するインテル® プロセッサーが検出されない場合は、generic バージョンの関数が実行されます。 インテル以外のプロセッサーでプログラムを実行する場合は、generic バージョンの関数を提供する必要があります。 generic バージョンの最適化の程度と想定するプロセッサー機能は制御することができます。

cpuid 属性は大文字と小文字の区別はありません。 __declspec(cpu_dispatch) を宣言した関数本体は空でなければなりません。そして、これはスタブ (本体が空の関数) と呼ばれます。

次の例は、cpu_dispatch キーワードと cpu_specific キーワードを使用して、第 2 世代インテル® Core™ プロセッサー・ファミリー、インテル® Core™ プロセッサー・ファミリー、インテル® Core™2 Duo プロセッサー・ファミリー、およびその他のインテル® プロセッサーまたは互換プロセッサー向けの関数バージョンを作成する方法を示します。 それぞれのプロセッサー固有関数バージョンは、プロセッサー固有の組込み関数を使用しているか、または個別のソースファイルに配置され、プロセッサー固有のコンパイラー・オプションでコンパイルされています。

#include <stdio.h> 
// 次のプロセッサー向けに特定の関数バージョンを生成する必要がある 
__declspec(cpu_dispatch(core_2nd_gen_avx, core_i7_sse4_2, core_2_duo_ssse3, generic )) 
void dispatch_func() {};      //  適切な関数バージョンを呼び出すスタブ

__declspec(cpu_specific(core_2nd_gen_avx)) 
void dispatch_func() {  
  printf("\nCode for 2nd generation Intel Core processors with support for AVX goes here\n"); 
} 

__declspec(cpu_specific(core_i7_sse4_2)) 
void dispatch_func() { 
  printf("\nCode for Intel Core processors with support for SSE4.2 goes here\n"); 
} 

__declspec(cpu_specific(core_2_duo_ssse3)) 
void dispatch_func() { 
  printf("\nCode for Intel Core 2 Duo processors with support for SSSE3 goes here\n"); 
} 

__declspec(cpu_specific(generic)) 
void dispatch_func() { 
  printf("\nCode for non-Intel processors and generic Intel processors goes here\n"); 
} 

int main() { 
  dispatch_func(); 
  printf("Return from dispatch_func\n"); 
  return 0;
}

注意事項

手動ディスパッチを使用する前に、この機能を使用するメリットがデメリット (追加工数とパフォーマンス低下の可能性) よりも重要かどうかをよく考慮してください。コードで手動プロセッサー・ディスパッチを使用する場合、次のような問題が発生することがあります。

リリース前に、すべてのターゲット・プラットフォームでアプリケーションをテストしてください。

プラグマを使用して手動でターゲット・プロセッサーを指定する

#pragma intel optimization_parameter target_arch を使用して、特定のインテル® プロセッサーで実行するルーチンに対してコードでフラグを設定できます。 このプラグマは、ルーチンレベルで -m オプションや /arch オプションを制御し、コマンドラインで指定されたオプションの値よりも優先されます。ターゲット・プロセッサーには、-m オプションや /arch オプションと同じ値を使用します。 次の例は、コマンドラインで指定された値に関係なく、プラグマを使用してルーチン bar() をインテル® AVX 対応プロセッサーでのみ実行するようにする方法を示します。

#pragma intel optimization_parameter target_arch=AVX
void bar() 
{
  ...
}

最適化に関する注意事項

インテル® コンパイラーは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項の適用対象である特定の命令セットの詳細は、該当する製品のユーザー・リファレンス・ガイドを参照してください。

改訂 #20110804


このヘルプトピックについてのフィードバックを送信