OpenACC

OpenACC  は、クレイ、CAPS、NVIDIA、そしてPGIによって開発された並列コンピューティングのための標準の一つである。この標準は、ヘテロジニアスなCPU/GPUシステムの並列プログラミングを単純化するために設計された。

位置付けとしては、CUDAやOpenCLをさらに抽象化したものであり、OpenMPと似た存在である。

OpenMPのようにプログラマーは、ディレクティブと追加関数を使って高速化されるべき箇所を識別するようにC言語、C++、そしてFORTRANのソースコードを書き換えれば良い。OpenMP 4.0 とより新しいバージョンのようにOpenACCはCPUとGPUの両方を対象にすることができ、それらの上で計算コードを起動することができる。

OpenACCの会員は、OpenMPの将来のリリースで動作する予定のアクセラレーターに対応したり、OpenMPを拡張する共通仕様を作成したり、OpenMPの仕様に合わせるためにOpenMP標準化グループの会員として働いてきた。これらの活動は、ある技術報告書としてまとめられている。この報告書のコメントと議論は、年次スーパーコンピューティング会議に時期を合わせるだけでなく、NVIDIA以外のアクセラレーターがOpenMPに参加しているハードウェアベンダーの意見をサポートするという表明にも時期を合わせている。

2012年の国際スーパーコンピューティング会議において、OpenACCは、NVIDIA、AMD そして Intel のアクセラレーター上で動作することを証明したが、性能データは公表されなかった。

2012年11月12日、SC12において、OpenACCバージョン2.0の草案が発表された 。 新しく提案された機能は、データ移動における新しい制御、明示的な関数呼び出し、そして分割コンパイルという機能を含んでいる。OpenACC 2.0は2013年1月に公式にリリースされた。

仕様バージョン2.5は、2015年10月にリリースされた。バージョン2.6は、2017年11月にリリースされた 。バージョン2.7は、2018年11月にリリースされた。

2019年4月3日にジョン・レベックは、「クレイはCCE/9.0におけるOpenACCのサポートを終了する」と発表した 。

1. コンパイラのサポート
-------------

OpenACCは、商用コンパイラとして利用可能である。PGIとクレイがサポートを行っている。

OpenUHは、CとFORTRANをサポートしているOpen64を基盤にしたオープンソースのOpenACCコンパイラである。ヒューストン大学のHPCToolsグループによって開発された。

OpenARCは、OpenACC 1.0仕様の全ての機能をサポートするためにオークリッジ国立研究所で開発されたオープンソースのCコンパイラである。実験的なphoronix-sep13}}オープンソースコンパイラaccULは、ラ・ラグーナ大学によって開発されている。

Omni Compilerは、筑波大学HPCS研究室と理化学研究所計算科学研究センターが共同研究しているオープンソースのコンパイラである。OpenACCの他、XcalableMP、及びXcalableMPをOpenACCと組み合わせたXcalableACCをサポートしている。

IPMACCは、ビクトリア大学 によって開発されたオープンソースのCコンパイラである。IPMACCは、OpenACCをCUDA、OpenCL、そしてISPCへ変換する。現在のところ、次のディレクティブのみがサポートされている。つまり、//data//, //kernels//, //loop//, そして //cache// である。

OpenACCに対するGCCのサポートは、進捗が遅かった。サムスンによるGPUを対象にした実装は、2013年9月に発表された。この実装は、OpenACC 1.1のコードをOpenCLへ変換する。2ヵ月後、「真」の実装の発表があった。今回はNVIDIAによるものであり、OpenACC 2.0に基づいたものであった。このことがいくつかの論争を引き起こした。OpenACC 2.0の実装がNVIDIA独自のPTXアセンブリ言語だけを対象にしており、PTXのために利用できるオープンソースのアセンブラあるいはランタイムは存在しなかった 。OpenACC/PTXに対する実験的サポートは、GCCのバージョン5.1の時点で終了した。GCC6とGCC7は、OpenACC 2.0a仕様のより改良された実装を搭載している。GCC 9.1は、OpenACC 2.5のサポートはほぼ完成していると発表した。

2. 使用方法
-------

対称型並列システムにおけるOpenMP 3.x あるいは初期のOpenHMPPに似た使用方法であり、OpenACCにおけるプログラミングの主要な手段はディレクティブである。その仕様は、いくつかのサポート関数を定義するランタイムライブラリも含んでいる。それらを利用するために利用者は、C言語で"openacc.h"、あるいはFortranで"openacc_lib.h"をインクルードしなければならない。そして、//acc_init//関数を呼び出す。

2.1. ディレクティブ
------------

OpenACCは、プラグマの幅広いリストを定義している。例えば、

pragma acc parallel
pragma acc kernels<WtXmlEndTag /> 別個のセマンティクスを用いて、上の2行はアクセラレーター上で実行される並列な計算カーネルを定義するために使われる。

pragma acc data<WtXmlEndTag /> 上はアクセラレーターと行き来するデータを定義したり、コピーしたりするための主要なディレクティブである。

pragma acc loop<WtXmlEndTag /> 上は parallel あるいは kernels の領域において並列性の形式を定義するために使われる。

pragma acc cache
pragma acc update
pragma acc declare
pragma acc wait<WtXmlEndTag />

2.2. ランタイム API
--------------

いくつかのランタイムAPI関数も定義されている。つまり、acc_get_num_devices, acc_set_device_type, acc_get_device_type, acc_set_device_num, acc_get_device_num,acc_async_test, acc_async_test_all, acc_async_wait, acc_async_wait_all, acc_init, acc_shutdown, acc_on_device, acc_malloc, acc_free のことである。

通常、OpenACCは、ターゲットデバイスのために作業組織を処理するが、作業組織はgangとworkerを使って再定義されることもある。gangは複数のworkerから構成され、多くの処理要素を操作する。

3. 関連項目
-------

XcalableACC
XcalableMP
C++ AMP
CUDA
OpenCL
OpenMP

4. 出典
-----

5. 学習用参考図書
----------

北山洋幸:「OpenACC基本と実践―GPUプログラミングをさらに身近に」、カットシステム、ISBN 978-4877834500 。
片桐孝洋:「並列プログラミング入門: サンプルプログラムで学ぶOpenMPとOpenACC」、東京大学出版会、ISBN 978-4130624565。
Sunita Chandrasekaran, Guido Juckeland: //OpenACC for Programmers: Concepts and Strategies//, Addison-Wesley Professional, ISBN 978-0134694283 。＃ 第1版。
Rob Farber: //Parallel Programming with OpenACC//, Morgan Kaufmann, ISBN 978-0124103979 。＃これは第1版だが第2版があるはず。
Gerardus Blokdyk: //OpenACC A Complete Guide//, 5STARCooks, ISBN 978-0655198109 。　＃　詳細不明。
[1]
[2]
[3]
[4]

6. 外部リンク
--------

https://www.openacc.org/ - 公式サイト
Usage example from NVIDIA: [5], [6]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]