インテル® C++ コンパイラー 14.0 ユーザー・リファレンス・ガイド
プラグマの後で宣言されたすべての関数と変数がターゲットで利用可能であることを示します。このプラグマは、インテル® MIC アーキテクチャーおよびインテル® グラフィックス・テクノロジーにのみ適用されます。 インテル® グラフィックス・テクノロジーはプレビュー機能です。
このプラグマは、プラグマの後で宣言されたすべての関数と変数がターゲットで利用可能であることを示します。
このプラグマを使用すると、個々の宣言にターゲット属性や declspec を追加する必要がありません。
プラグマをオンにするには、push と target(target-name) を指定するか、target(target-name) のみを指定します。 push は target-name をスタックにプッシュします。 target(target-name) のみを指定すると、コンパイラーはプラグマよりも前の状態を記憶しません。
次の例は、このプラグマの使用方法を示します。
この例では、push 文と pop 文の間のすべての関数と変数をターゲットに転送するように指示します。
// mic ターゲットをスタックにプッシュする。 #pragma offload_attribute (push, target (mic)) // 関数および変数。 ... // mic ターゲットをスタックから削除して以前の状態に戻す。 #pragma offload_attribute (pop)
この例では、クラス 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