インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド
プラグマの後で宣言されたすべての関数と変数がコプロセッサーで利用可能であることを示します。このプラグマは、インテル® MIC アーキテクチャーにのみ適用されます。
#pragma offload_attribute([push, ] target(target-name)) #pragma offload_attribute(pop|{target(none)}) |
ターゲットの名前。
ターゲットを表す識別子 (mic) を事前定義します。
プラグマをオンにします。target-name を内部コンパイラー・スタックにプッシュします。文 #pragma offload_attribute (pop, target(target-name)) まで、またはコンパイル単位の終了まで、後続のすべての関数と変数はインテル® MIC アーキテクチャーをターゲットにします。
デフォルト。
プラグマをオフにします。target-name を内部コンパイラー・スタックのトップから削除します。
target-name に none を指定すると、プラグマはオフになります。
このプラグマは、プラグマの後で宣言されたすべての関数と変数がコプロセッサーで利用可能であることを示します。
このプラグマを使用すると、個々の宣言にターゲット属性や declspec を追加する必要がありません。
プラグマをオンにするには、push と target-name を指定するか、target-name のみを指定します。push は target-name をスタックにプッシュします。push を指定しない場合、コンパイラーはプッシュ前の状態を記憶しません。
push を指定した後に pop を指定すると、プラグマはオフになります。
push を指定しないで target-name に none を指定すると、プラグマはオフになります。
次の例で、push と pop 文の間のすべての関数と変数はコプロセッサーをターゲットにします。
// mic ターゲットをスタックにプッシュする。 #pragma offload_attribute (push, target (mic)) // 関数および変数。 ... // mic ターゲットをスタックから削除して以前の状態に戻す。 #pragma offload_attribute (pop)
次の例で、target(mic) と target(none) 文の間のすべての関数と変数はコプロセッサーをターゲットにします。
// ターゲット・アーキテクチャーを mic に変更し、ターゲットをスタックに配置しない。 #pragma offload_attribute (target (mic)) // 関数および変数。 ... // ターゲット・アーキテクチャーを none に変更してプラグマをオフにする。 #pragma offload_attribute (target(none))
次の例で、クラス A とクラス B はどちらも target(mic) 属性を取得します。
クラスのユーザーが追加したデータメンバー(データメンバー av など)と、コンパイラーが作成した内部データメンバー(仮想関数テーブルなど)はどちらも、offload_attribute プラグマ領域内で囲まれるため、target(mic) 属性を取得します。
クラスの target(mic) または _Cilk_shared 属性は継承されないため、クラスの定義または push/pop メカニズムでそれぞれ明示する必要があることに注意してください。
また、仮想ディスパッチでメンバー関数の正しいオフロードを行うには、階層のすべてのクラスが target(mic) または _Cilk_shared 属性でマークされている必要があることにも注意してください。
fileA.h #include <vector> class A { ... private: std::vector<int> av; }; fileB.cpp #pragma offload_attribute (push,target(mic)) #include "fileA.h" class B : public A { ... }; #pragma offload_attribute (pop)
次の例では、クラス C および元の定義の名前空間 U の内容は offload_attribute プラグマで囲まれるため、target(mic) 属性を取得します。ただし、名前空間 U はこの属性が明示されません。
結果的に、クラス D および拡張された名前空間 U の内容は offload_attribute プラグマで囲まれないため、target(mic) 属性を取得しません。
#pragma offload_attribute (push,target(mic)) namespace U { class C { ... }; ... } // 名前空間 U の元の定義 #pragma offload_attribute (pop) namespace U { class D { ... }; ... } // 拡張された名前空間 U