OpenACCIntro
25/27 dataプラグマ(present)

【テロップ】
※各テロップ文字をクリックすると該当の場所がピンポイントで閲覧できます。



【ノート】
これまで紹介したものは、データ転送を行なう方法について指示するものでしたが、ここで紹介するプレゼントは、データ転送をしないことを指示するものです。 少しややこしい例ですが、プログラムを見てください。このプログラムにはメイン関数と、メイン関数から呼ばれる関数nvがあり、配列xxがメイン関数で宣言されています。関数nvは配列xxをひき数として呼び出されます。 実際の並列計算は、関数nvの中のフォーループで行われ、そのフォーループの前には、パラレルプラグマおよびループプラグマがあります。このフォーループの前後でデータ転送をするかいなかですが、 ★ ここのデータプラグマには、プレゼントということで配列zzが指示されています。つまり、すでにGPUメモリ内にデータはあるので、データ転送はしなくてよい、という意味になります。 では、CPUメモリからGPUメモリへのデータ転送はどこでやっているかというと、 ★ このように、メイン関数の中でそれを指示しています。 動作を確認します。まず、 ★ CPUメモリ上に、初期化された配列xxがあります。それが、 ★ データプラグマのコピーで、 ★ GPUメモリにデータ転送されます。 この後、関数nvが100回呼び出され、 ★ 関数nv無いで、配列zz、実際はメイン関数で宣言された配列xxが更新されます。 ★ つまり、関数nvは100回呼ばれますが、データプラグマでプレゼントの指示がされているので、 関数nvの中では、データ移動は不要になります。 ★ その後、メイン関数のデータプラグマのコピーの指示で、最後にGPUメモリからCPUメモリにデータ転送がされ、 ★ CPUメモリ上のあたいが更新されます。 以上のように、データプラグマのプレゼントは、データ転送が不要であることを、明示的に指示するために用いられます。