インテル® C++ コンパイラー 14.0 ユーザー・リファレンス・ガイド
このトピックは、インテル® グラフィックス・テクノロジー向けの IA-32 アーキテクチャーにのみ適用されます。インテル® グラフィックス・テクノロジーはプレビュー機能です。
インテルではユーザー・コミュニティーとの関係を促進するため、しばしばプレビュー機能を提供しています。プレビュー機能を通じて、今後の開発および拡張機能に対するご意見やご要望をお寄せください。インテル® グラフィックス・テクノロジーはプレビュー機能ですが、コンパイラー製品の一部としてサポートされています。実装通りに動作しますが、この機能に由来または関連する追加機能はまだご利用いただけません。また、サポートには、以下に示す制約があります。現在の実装は大幅に変更される可能性もあります。この機能の正式バージョンが将来のリリースに含まれるどうかはまだ未定です。
オフロードコードには次の制約があります。
#pragma offload target(gfx) は #pragma parallel_loop で並列実行するとして明示的にマークされた完全な入れ子ループの前でのみ指定できます。
#pragma offload 文に続く文の内部で __GFX__ マクロを使用しないでください。 ただし、プラグマから呼び出されるサブプログラムでこのマクロを使用することはできます。
この制約は Windows* 8 および Windows Server* 2012 には適用されません。 ターゲットへのオフロードはグラフィックス・ドライバーにアクセスできるセッションでのみ可能です。
デフォルトでは、システム回復タイムアウト時間 (通常は 2 秒) より長くオフロードタスクを実行することはできません。オフロードランタイムでは、タスクは別のタイムアウト (32 秒) 後にハングまたは異常終了します。オフロードタスクを 32 秒より長く実行できるようにするには、タイムアウト検出と回復 (TDR) レジストリー・キーに関する Microsoft* のドキュメントを参照し、システム・レジストリーを編集してタイムアウトによる回復を無効にします。
専用グラフィックス・カードが搭載されているマシンでターゲットにオフロードするには、プライマリー・グラフィックス・デバイスをターゲットにする必要があります。
#pragma offload 領域内のマクロはすべて、同じ変数を使用してコードを評価しなければなりません。 例えば、次のコードは N、inputArray および outputArray がコードの CPU バージョンで使用されていないため、未定義の動作を引き起こします
#pragma offload target(gfx) pin(inputArray, outputArray: length(N))
#pragma parallel_loop
for (int i = 0; i < N; i++){
#ifdef GFX
out[i] = in[i]/N;
#else
// 何もしない
#endif
}
#pragma parallel_loop [collapse(N)] と関連する並列ループは完全な入れ子でなければなりません。 これらのループのループ・インデックス変数の型は int または unsigned のいずれかでなければならず、ストライドはコンパイル時に既知でなければなりません。
アプリケーションがターゲットとホストのコードを並列に実行する場合、フォルス・シェアリング問題を回避するため、ホストとターゲットが同じキャッシュラインを変更しないようにする必要があります。例えば、キャッシュラインのサイズの倍数になるように pin 節に渡す変数をパディングします。ホストとターゲットが同じ配列を処理する場合は、並列オフロードコードの書き込みアクセスが対応するようにします。 変数に __declspec(avoid_false_share) を指定すると、その変数がアライメント (パディング) され、ほかの変数とのフォルス・シェアリングを回避できます。
再帰呼び出しはサポートされていません。
ヘッダーファイル math.h は単精度関数 (sinf など) を倍精度に拡張するため、コンパイラーが単精度に戻すときにパフォーマンスが低下したり、問題が発生することがあります。 この問題を回避するには、代わりに mathimf.h を使用します。
コンパイラーは算術関数のサブセットのみサポートします。これらの算術関数は、インテル® グラフィックス・テクノロジーの命令セット・アーキテクチャーに直接マップされるか (可能な場合)、コンパイラーと一緒に提供される SVML で実装されます。次の関数のみサポートされています。
acos/acosf
acosh/acoshf
asin/asinf
asinh/asinhf
atan/atanf
atanh/atanhf
cbrt/cbrtf
sqrt/sqrtf
ceil/ceilf
cos/cosf
erf/erff
erfc/erfcf
exp/expf
exp10/exp10f
exp2/exp2f
expm1/expm1f
fabs/fabsf
floor/floorf
invsqrt/invsqrtf
log/logf
log10/log10f
log1p/log1pf
log2/log2f
nearbyint/nearbyintf
rint/rintf
round/roundf
sin/sinf
sinh/sinhf
tan/tanf
tanh/tanhf
trunk/truncf
copysign/copysignf
atan2/atan2f
fmax/fmaxf
fmin/fminf
hypot/hypotf
pow/powf
倍精度の除算もサポートされており、SVML 関数の呼び出しに変換されます。
コンパイラーはヘテロジニアス・コードで可変長配列割り当てをサポートしません。例えば、float myArray[variableSize]; (variableSize は変数) を使用する代わりに float myArray[CONSTANT_SIZE]; (CONSTANT_SIZE はコンパイル時定数) を使用します。
コードリンクはターゲットコードではサポートされていないため、ターゲットコードのライブラリーをバイナリー形式でビルドしてほかのアプリケーションで使用することはできません。また、あるコンパイル単位のターゲット用にコンパイルされたコードから異なるコンパイル単位のターゲット関数を呼び出すことはできません。
64 ビット整数 (long long) 型の演算はターゲットコードではサポートされていません。
long double 型の演算はターゲットコードではサポートされていません。
longjump/setjump はターゲットコードではサポートされていません。
次の間接制御フローはターゲットコードではサポートされていません。
関数のアドレスを受け取り、ポインターで関数を呼び出す関数ポインター
仮想関数の呼び出し
switch 文はターゲットコードではサポートされています。
例外はターゲットコードでは許可されていません。
RTTI はターゲットコードではサポートされていません。
可変長引数 (…) の関数はターゲットコードではサポートされていません。
ホストとターゲット間でのポインターの共有およびコピーはサポートされていません。ポインターはターゲットとホストで異なる意味を持つため、ホストで有効なポインター値がターゲットで有効であるとは限りません。ポインター値の自動変換は行われません。
オフロードコードでは、ポインター型要素の配列、ポインターへのポインター、構造体やクラスのポインター型メンバーは使用できません。
target(gfx) ベクトル関数のポインター型または参照型の引数は linear または uniform のいずれかでなければなりません。ベクトル関数はポインター型または参照型の値を返すことはできません。
グローバル変数またはスタティック変数はポインター型または参照型にできません。
ポインター型と非ポインター型の変換は許可されていません。
ポインターまたは参照のアドレスをとることはできません。
次のプラグマはサポートされていません。
offload_transfer
offload_wait
pragma offload の次の指定子はサポートされていません。
signal
wait
mandatory
pragma offload の次の修飾子はサポートされていません。
alloc_if
free_if
alloc
into
#pragma offload target (target-name [ :target-number ]) の target-number は無視されます。
ローカルスカラー変数は #pragma offload の in 節でのみ渡すことができます。
コンパイラーは #pragma offload 文の語彙スコープで使用される変数を in 節に自動的に追加するため、ローカルスカラー変数を in 節に追加することは冗長であり省略できます。 ローカルスカラー変数は値で渡されます。オフロード後は、ターゲットコード内の変数に対する更新をホスト側で見ることはできません。
例えば、次のコードは var = 55、i = 0 を出力します。
int var = 55;
int i = 0;
#pragma offload target(gfx)
#pragma parallel_loop
for (i = 0; i < 1; i++)
{
++var;
}
printf("var = %d, i = %d\n", var, i);ローカル変数 var は in 節にのみリストできるため、次のコードはコンパイル時にエラーになります。
int var = 55;
int i = 0;
#pragma offload target(gfx) inout(var)
…グローバル変数またはスタティック変数は #pragma offload の pin 節にリストできません。
インテル® コンパイラーは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項の適用対象である特定の命令セットの詳細は、該当する製品のユーザー・リファレンス・ガイドを参照してください。 改訂 #20110804 |