まとめ

以上のように、OpenACCでは、プログラマが並列に実行できる部分を見つけると、どのように実行すれば効率的であるかを指定する記述を行うことができる。また、ここで取り上げた例では、単純な指定ではCPUとGPUのメモリ間のデータ転送の時間が長く性能が低いが、データの局所性を利用して、不要なデータコピーを省く指定を行えば、CPUでの実行を超える性能を実現できる。

さらに、loopディレクティブに詳細な指定を加えることにより、並列スレッドの実行をさらに効率化できるようになっている。

図29 OpenACCの4ステップのチューニング

OpenACCでのGPUオフロードと並列化は、単純に並列化可能なループに#pragma acc loopをつけるだけというほど簡単ではないが、データ転送の要否を指定するdata regionの指定や配列ごとにどのような処理が必要かを指定することにより、多くの場合は、大きな性能改善が得られる。また、OpenACCは並列スレッドの実行方法も指定することができ、アクセラレータの構造に合わせた最適化ができるようになっている。

なお、CAPSのOpenACCコンパイラはNVIDIAのGPUだけでなく、AMDのGPUやIntelのXeon Phiのコードを生成することができるようになっており、Radeon GPUやXeon Phiを使う場合にも、OpenACCを使うことができるようになっており、OpenACCはNVIDIAのGPUだけのものではない。

PGIやCAPSは、お試し用に無料ライセンスを提供しており、コンパイラを購入しなくても、これを使って様子をみることができる。また、フリーのOpenACCコンパイラとしては、Mentor GraphicsはgccにOpenACCサポートを組み込むという開発を行っており、ヒューストン大もOpenUHコンパイラでOpenACC 1.0のサポートを行っている。このような状況から、ユーザ側としても、簡単にGPU並列化が行えるOpenACCへの関心が高まっており、このチュートリアルセッションは盛況であった。