インテル® Fortran コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーをターゲットとする場合にのみ適用されます。
オフロードコードには次の制約があります。
CPU で実行するコード内およびコプロセッサーで実行するコード内で例外処理が行われた場合、CPU の例外を CPU で扱い、コプロセッサーの例外をコプロセッサーで扱うことは可能ですが、コプロセッサーの例外を CPU で扱うことはできません。
このトピックは、古い (非推奨の) 機能であるインテル® Cilk™ Plus に関する情報を含んでおり、将来のリリースでは削除される予定です。
!DIR$ OMP OFFLOAD 文に続く文の内部でディレクティブを使用しないでください。ただし、ディレクティブから呼び出されるサブプログラムではマクロを使用することができます。
コンパイラーは、OFFLOAD ディレクティブに続く文の中にある関数に対してインライン展開を行いません (FORCEINLINE ディレクティブが指定された関数も含む)。ただし、コンパイラーの判断で、OFFLOAD ディレクティブが指定された文から呼び出されたサブプログラムで関数のインライン展開を行う可能性があります。
ホスト CPU スレッドは同時に複数実行できますが、コードのセクションをオフロードするのは 1 つのホスト CPU スレッドです。この場合、ロック、アトミック、ミューテックス、OpenMP* atomic 操作、OpenMP* critical、OpenMP* taskwait、OpenMP* barrier などの同期メカニズムは、ホスト CPU コードとターゲットにオフロードされたコードとの間では動作しません。ただし、ホスト CPU のコードが OpenMP* を使用して並列化されている場合、OpenMP* 並列領域の一部がターゲットにオフロードされても、OpenMP* 並列領域の最後の同期は保証されます。
変数をターゲットで使用できるようにするには、オフロードコード内から呼び出される関数で参照されるグローバル変数が、一致するターゲット属性で宣言されている必要があります。また、ホストとターゲット間でこれらの変数の値を同期するため、in/out/inout 節を指定して明示的に値を送信/受信する必要があります。オフロードプラグマの語彙スコープ内でアクセス可能なグローバル変数は、一致するターゲット属性で宣言されている必要はありません。また、関連する値はデフォルトで送信/受信されます。オフロードプラグマの語彙スコープで使用されるグローバルポインター変数は、in/out/inout 節内で指定する必要があります。これはコンパイラーによる制約です。
デフォルトでは、ポインター変数は対応する型の単一要素を指すと仮定されます。オフロードコードはポインターを逆参照して単一要素にアクセスできます。ポインターが指すデータ要素はターゲットメモリーおよび調整されたポインター値に自動的にコピーされます。element-count-expr 式と in / out / inout 引数を使用して、可変長データをコピーできます。
非ポインター型へのポインターのみサポートされます。非ポインター型には TARGET 属性が含まれていなければなりません。ポインター変数へのポインターはサポートされていません。これはコンパイラーによる制約です。
配列は、配列要素がスカラー型か、ビット単位でコピーできる派生型の場合のみサポートされるため、ターゲットが CONTIGUOUS の場合、ポインター配列はサポートされます。
ポインターはホストとターゲット間のインターフェイスでコピーされず、代わりにポインターが指すデータがコピーされるため、別々の変数を指すポインター間の相対距離はホストとターゲットでは異なります。同じデータ構造内のポインター間の距離は、オフロードの後でも同じです。このため、ホスト CPU 上では有効であったポインター比較と算術演算は、ターゲット上では信頼性がなく、適切に使用できません。
ポインターメンバーと非ポインターメンバーの組み合わせを含む共用体は、非ポインター値型を保持していると見なされます。このため、ポインターに対して特別な解釈は行われず、指されていたデータはターゲットにコピーされません。
すべてがポインターメンバーの共用体は、ホストとターゲット間でコピーできません。
オフロード領域が、別のファイルで定義されている関数を呼び出し、その関数がグローバル変数を参照している場合、必要に応じてグローバル変数がコピーされるように注意する必要があります。
グローバル変数が外部関数でのみ参照され、オフロード領域内で直接参照されない場合、コンパイラーは現在のコンパイル単位の範囲外の参照を認識しないため、そのようなグローバル変数はコピーされません。
外部関数で参照される変数がオフロード領域でも参照される場合、そのような変数はコピーされます。
グローバル変数がファイルスコープの静的変数の場合、in または out 節で指定することはできません。次のいずれかの方法を使用して値にアクセスする必要があります。
外部変数にしてオフロードの in または out 節に追加します。
専用の関数を使用して変数値をローカル変数にフェッチし、ローカル変数を in または out 節に追加します。
!DIR$ OFFLOAD 領域内でビット単位でコピーできないオブジェクトを使用することはできません。使用すると、コンパイラーはエラーを出力します。
内部プロシージャーのオフロード領域にホスト結合変数を含めることはできません。