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