OpenACC

OpenACC (open acceleratorsの略) は、クレイ、CAPS、NVIDIA、そしてPGIによって開発された並列コンピューティングのための標準の一つである。この標準は、ヘテロジニアスなCPU/GPUシステムの並列プログラミングを単純化するために設計された。 位置付けとしては、CUDAやOpenCLをさらに抽象化したものであり、OpenMPと似た存在である。 OpenMPのようにプログラマーは、ディレクティブと追加関数を使って高速化されるべき箇所を識別するようにC言語、C++、そしてFORTRANのソースコードを書き換えれば良い。OpenMP 4.0 とより新しいバージョンのようにOpenACCはCPUとGPUの両方を対象にすることができ、それらの上で計算コードを起動することができる。 OpenACCの会員は、OpenMPの将来のリリースで動作する予定のアクセラレーター（GPUやコプロセッサなど）に対応したり、OpenMPを拡張する共通仕様を作成したり、OpenMPの仕様に合わせるためにOpenMP標準化グループの会員として働いてきた。これらの活動は、ある技術報告書としてまとめられている。この報告書のコメントと議論は、年次スーパーコンピューティング会議（2012年11月、ソルトレイクシティ）に時期を合わせるだけでなく、NVIDIA以外のアクセラレーターがOpenMPに参加しているハードウェアベンダーの意見をサポートするという表明にも時期を合わせている。 2012年の国際スーパーコンピューティング会議（ISC’12）において、OpenACCは、NVIDIA、AMD そして Intel のアクセラレーター上で動作することを証明したが、性能データは公表されなかった。 2012年11月12日、SC12（2012年のスーパーコンピューティング会議）において、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のサポートを終了する」と発表した 。 OpenACCは、商用コンパイラとして利用可能である。PGI（コンパイラバージョン12.6から）とクレイ（同社のハードウェアのみ）がサポートを行っている。 OpenUHは、CとFORTRANをサポートしているOpen64（英語版）を基盤にしたオープンソースのOpenACCコンパイラである。ヒューストン大学のHPCToolsグループによって開発された。 OpenARCは、OpenACC 1.0仕様の全ての機能をサポートするためにオークリッジ国立研究所で開発されたオープンソースのCコンパイラである。実験的なオープンソースコンパイラ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のサポートはほぼ完成していると発表した。 対称型並列システムにおけるOpenMP 3.x あるいは初期のOpenHMPP（英語版）に似た使用方法であり、OpenACCにおけるプログラミングの主要な手段はディレクティブである。その仕様は、いくつかのサポート関数を定義するランタイムライブラリも含んでいる。それらを利用するために利用者は、C言語で"openacc.h"、あるいはFortranで"openacc_lib.h"をインクルードしなければならない。そして、acc_init()関数を呼び出す。 OpenACCは、プラグマ（ディレクティブ）の幅広いリストを定義している。例えば、 #pragma acc parallel #pragma acc kernels 別個のセマンティクス（意味論）を用いて、上の2行はアクセラレーター上で実行される並列な計算カーネル（ここで言うカーネルはOSの中心部ではなくて、アクセラレーター上で実行される計算プログラムのこと）を定義するために使われる。 #pragma acc data 上はアクセラレーターと行き来するデータを定義したり、コピーしたりするための主要なディレクティブである。 #pragma acc loop 上は parallel あるいは kernels の領域において並列性の形式を定義するために使われる。 #pragma acc cache #pragma acc update #pragma acc declare #pragma acc wait いくつかのランタイム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から構成され、多くの処理要素を操作する（OpenCLのworkgroupに相当）。 XcalableACC XcalableMP C++ AMP CUDA OpenCL OpenHMPP（英語版） OpenMP