インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス

プラグマを使用したターゲット固有のコードの記述

このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーにのみ適用されます。

このトピックは、インテル® Xeon Phi™ コプロセッサー x100 製品ファミリー (開発コード名 Knights Corner) にのみ適用されます。

ターゲット固有の組込み関数を利用するように、ターゲットで実行する関数とオフロードコードのセクションを記述することができます。

コンパイラーは、コプロセッサー向けのコードを生成するとき、対象となるコプロセッサー・アーキテクチャー用のマクロを定義します (例えば、インテル® Xeon Phi™ コプロセッサー x100 製品ファミリー (開発コード名 Knights Corner) の場合は __MIC__)。 #ifdef __MIC__ セクション内にターゲット固有のコードを記述することができます。

#pragma offload 文に続く文の内部でマクロを使用しないでください。 ただし、プラグマから呼び出されるサブプログラムではマクロを使用することができます。

クラス F32vec の実装は CPU とコプロセッサー専用です。 コプロセッサーで実行する場合、オフロードコードで専用バージョンを使用できます。 オフロードに失敗して構造を CPU で実行する場合は、CPU バージョンを使用します。

// クラス F32vec はオフロードコードで使用されます
// target(mic) 属性が必要です

#pragma offload_attribute(push,target(mic))

// CPU とコプロセッサー向けにカスタマイズしたバージョンを使用

#ifdef __MIC__

	// このクラスのインテル® MIC アーキテクチャー・バージョンは micvec.h に含まれています
	#include <micvec.h>

#else
	// CPU バージョンはインラインで記述されています
	class F32vec16
	{
  		public:
    		...
    		friend F32vec16 sqrt(const F32vec16& a);
	};
#endif

mysqrt()
{
   #ifdef __MIC__
        F32vec16 w = ...;
        F32vec16 s;
        s = sqrt(w);
   #endif
               ...
}

#pragma offload_attribute(pop)

int main()
{
   #pragma offload target(mic)
     {
        mysqrt();
     }
     ...
}

関連情報