OpenACCIntro
26/27 dataプラグマ(present)
【テロップ】
※各テロップ文字をクリックすると該当の場所がピンポイントで閲覧できます。
【ノート】
データプラグマのプレゼントは、関数呼び出しの際に用いられるだけではなく、データ転送が不要な場面であれば用いることができます。 ここの例では、配列xxがあり、最初のフォーループでその配列が読み出されて書き込まれる、つまり更新されていますが、 次のフォーループでは、配列xxは読み出しがされています。しかし、その間に、青色で書かれた、スキャンエフ関数で、標準入力からあたいが取り込まれているので、この部分はGPUでは実行できないので、データプラグマの範囲を前後で分割しないといけないことになります。しかし、配列xxは最初のデータプラグマの範囲で、すでにGPUメモリにあるので、2個目のデータプラグマの範囲ではプレゼントの指示を行い、データ転送が不要であることを示しています。 プログラムの流れとしては、 ★ 配列xxは初期化されてCPUメモリにあり、 ★ 最初のフォーループの前で、配列xxはコピーインなので、 ★ GPUメモリにデータ転送されます。 ★ さらに、最初のフォーループで、配列xxは、並列計算の結果、更新されます。 ★ 次に、スキャンエフ関数で変数dが、CPUで読み込まれ、 ★ 2個目のデータプラグマの範囲の最初で、変数dがコピーインで、 ★ CPUメモリから、GPUメモリにデータ転送されます。さらに、 ★ 変数sは0で初期化され、 ★ データプラグマはコピーで指示され、 ★ CPUメモリから、GPUメモリにデータ転送されます。 この時、配列xxはプレゼントなので、データ転送されません。 ★ その後、2番目のフォーループで、変数sに加算のリダクション演算が行われ、 ★ 変数sがGPUメモリからCPUメモリにデータ転送され、 ★ CPUメモリ上のあたいが更新されます。 このように、データプラグマを有効に使うことで、きめこまやかなデータ転送が実現でき、オープンACCによるGPUの並列計算が効率よく実装できることになります。