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

プロセッサー・グラフィックスへの変数と関数の配置

このトピックは、インテル® グラフィックス・テクノロジー向けの IA-32 アーキテクチャーにのみ適用されます。インテル® グラフィックス・テクノロジーはプレビュー機能です。

offload プラグマに続く文は、コプロセッサーで実行するアウトライン関数に変換されます。このコードは、ほかの関数を呼び出すことができます。呼び出された関数がコプロセッサーでも利用できることを保証するには、次の特別な関数属性を指定する必要があります。

__declspec( target (gfx)) function-declaration

プログラムの関数はすべて、常に CPU 向けにコンパイルされ、CPU で呼び出すことができます。ただし、この特別な属性で明示された関数のみ、オフロードコードで呼び出すことができます。また、これらの関数のみ、コプロセッサーで呼び出すことができます。

グローバル変数は同様の方法で扱われます。グローバル変数はすべて、CPU コードに常に存在します。しかし、ターゲット属性を含むグローバル関数のみ、ターゲットにオフロードされるバイナリーにコンパイルされます。次の特別な変数属性を指定します。

__declspec( target (gfx))variable-declaration

ターゲット属性で明示された関数とデータのみターゲット・バイナリーにコンパイルすると、コプロセッサーのコードが可能な限り小さくなることが保証されます。

コンパイラーは、ターゲット属性を含まないオフロードコード内で参照された関数とデータに対して警告を出力します。

注

オフロード構造内の関数呼び出しは、関数をターゲットで利用できるように自動的に宣言しません。関数がターゲット上で利用できることを保証するには、関数定義に適切なターゲット属性が含まれていなければなりません。

注

ターゲット属性を含む変数または関数の定義とすべての宣言は、すべてのコンパイル単位で互いに一致していなければなりません。

例

__declspec(target(gfx))
 int glo__declspec(target(gfx)) // ホストとターゲットでグローバル変数を割り当てます。
int global = 55;

__declspec(target(gfx)) // 関数 foo のホストバージョンとターゲットバージョンを作成します。
int foo()
{
    return ++global;
}

int main (int argc, char* argv) 
{
    int i;
    #pragma offload target(gfx) inout(global) // 次のループをターゲットにオフロードします。
   #pragma parallel_loop
    for (int i = 0; i < 1; i++)
    {
        foo();
    }
    
    printf("global = %d (should be 56)\n", global);

    if (global == 56) {
        printf("Passed\n");
        return 0;
    }
    else {
        printf("Failed\n");
        return 1;
    }

}

最適化に関する注意事項

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

改訂 #20110804


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