GTC 2014において、NVIDIAのJeff Larkin氏がOpenACCのチュートリアルを行った。OpenACCを理解するうえで、分かりやすいと思うので、紹介したい。

図1 OpenACC入門を講義するNVIDIAのJeff Larkin氏

CPUを使うマルチコア、マルチソケットシステムでは、メモリは共通でプログラムやデータは、どのプロセサからでもアクセスできる。このような共通メモリのマルチプロセサシステムでは、OpenMPを使って並列化を行うのが一般的である。

一方、GPUのメモリはCPUのメモリとは独立したメモリであり、CPUからGPUに処理を依頼する場合にはプログラムやデータをGPUメモリにコピーしてやる必要がある。また、GPUでの処理が終わったことを確認してデータをGPUメモリからCPUメモリにコピーする必要がある。

このようなCPU-GPUの分散処理をおこなうため、NVIDIAはCUDAを開発したのであるが、このような両者のメモリの間でのデータのコピーをプログラマが記述する必要がある点が、GPUを取っつき難いものにしていることは否めない。

このため、OpenMPを拡張して、CPU-GPUの分散処理を可能にしようという検討が始まったが、GPUだけでなくDSPなどもカバーしようとする大きなスコープの目標であったので、なかなか纏まらず、GPUに絞って早期に規格を作りたいグループが独立して作ったのがOpenACCである。しかし、Larkin氏は両方の規格検討のメンバとなっているように、両規格の検討委員は重複しており、対立しているというわけではないとのことである。

OpenACCは2011年11月に最初のOpenACC 1.0がリリースされ、2013年6月にはOpenACC 2.0がリリースされている。

図2 OpenACCの状況

当初のOpenACCのメンバーはCAPS、Cray、NVIDIA、PGIの4社であったが、現在では10社以上にメンバーが増加している。

一方、OpenMPは、共通メモリのシステム用に1997年に開発された長い歴史をもつ仕様であるが、アクセラレータをサポートするOpenMP 4.0がリリースされたのは2013年である。

図3 OpenMPの状況

OpenACCは、OpenACC 2.0をサポートするコンパイラがCray、CAPS、PGI(NVIDIAに買収され、現在はNVIDIAの1部門となっている)の3社から製品として出ており、gccでのサポートやOpenUHというヒューストン大学のコンパイラなどのオープンソースの開発も進んでいる。一方、OpenMP 4.0は、Intelコンパイラなどがサポートを進めているが、NVIDIA GPU向けの製品版のコンパイラは、まだ無い、という状況である。