インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーをターゲットとする場合にのみ適用されます。
このトピックは、INTO 修飾子と OFFLOAD ディレクティブのセットを使用する方法について説明します。
INTO 修飾子は、CPU 上の 1 つの変数からコプロセッサー上の別の変数へ (またはその逆に) データを転送します。INTO 修飾子を使用する場合、variable-ref リストでは 1 つの項目のみ指定できます。この制限により、1 つのソースとデスティネーション間で一対一の対応が確立されます。
INTO と IN 節を使用すると、データは CPU オブジェクトからコプロセッサー・オブジェクトへコピーされます。ALLOC_IF、FREE_IF、および ALLOC 修飾子を INTO 式に適用できます。
INTO と OUT 節を使用すると、データはコプロセッサー・オブジェクトから CPU オブジェクトへコピーされます。ALLOC_IF、FREE_IF、および ALLOC 修飾子を OUT 式に適用できます。
INTO 修飾子と INOUT および NOCOPY 節を使用することはできません。
INTO 修飾子を使用すると、ソース式は INTO 式で指定されたメモリー範囲にコピーする要素のストリームを生成します。ソースとデスティネーションのメモリー範囲がオーバーラップすると、未定義の動作を引き起こします。異なる IN および OUT 節からの転送では順序を仮定することができません。
次の例について考えてみます。
「部分コピー」は、P の最初の 500 個の要素を、P1 の最後の 500 個の要素にコピーします。
「オーバーラップ・コピー」は、P の最初の 600 個の要素を P1 にコピーし、P の最後の 400 個の要素を P1(100) 以降にコピーしますが、P1 (100) は前の IN 節で初期化されています。
「ランクの変更」は、コプロセッサーのランク 2 のデータが CPU のランク 1 のデータにコピーされるため、サイズは同じですがエラーになります。
INTEGER :: P (1000), P1 (2000) INTEGER :: RANK1 (1000), RANK2 (10, 100) ! 部分コピー !DIR$ OFLOAD … IN ( P (1:500) : INTO ( P1 (501:1000) ) ) … ! オーバーラップ・コピー、結果は未定義 !DUR$ OFFLOAD … IN ( P (1:600) : INTO ( P1 (1:600) ) ) … & & IN ( P (601:1000) : INTO ( P1 (100:499) ) ) … ! ランクの変更は不可 - エラー !DIR $ OFFLOAD … OUT ( RANK1, OUT (RANK2) ) …