インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド
手動プロセッサー・ディスパッチ機能を使用すると、手動でターゲット・プロセッサーを指定できます。cpu_specific キーワードと cpu_dispatch キーワードを使用することで、特定のインテル® プロセッサーでのみ実行する関数のバージョンを作成したり、ほかのインテル® プロセッサーとインテル以外のプロセッサーで実行する汎用バージョンを作成できます。 ランタイムにインテル® プロセッサーの種類が検出され、対応する関数バージョンが実行されます。この機能は、IA-32 またはインテル® 64 アーキテクチャー・ベースのインテル® プロセッサーでのみ利用できます。インテル以外のプロセッサーや IA-64 アーキテクチャー・ベースのインテル® プロセッサーでは利用できません。手動プロセッサー・ディスパッチ機能を使用してビルドしたアプリケーションは、互換プロセッサーよりもインテル® プロセッサーでより高度に最適化されることがあります。
コードで __declspec(cpu_dispatch(cpuid, cpuid,...)) 構文を使用すると、ターゲット・プロセッサーのリストと空の関数本体/関数スタブを提供できます。 __declspec(cpu_specific(cpuid)) を使用すると、各関数のプロセッサー固有バージョンを宣言できます。
次の表は、cpuid の値を列挙したものです。
cpuid の引数 |
プロセッサー |
---|---|
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> // need to create specific function versions for the following processors: __declspec(cpu_dispatch(core_2nd_gen_avx, core_i7_sse4_2, core_2_duo_ssse3, generic )) void dispatch_func() {}; // stub that will call the appropriate specific function version __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 対応プロセッサーでのみ実行するようにする方法を示します。
インテル® コンパイラーは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項の適用対象である特定の命令セットの詳細は、該当する製品のユーザー・リファレンス・ガイドを参照してください。 改訂 #20110804 |