インテル® Fortran コンパイラー 17.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) ) …