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 ^ The OpenACC® Application Programming Interface Version 3.3 | OpenACC-Standard.org ^ "Nvidia, Cray, PGI, and CAPS launch 'OpenACC' programming standard for parallel computing". The Inquirer. 4 November 2011. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明) ^ "OpenACC standard version 2.5" (PDF). OpenACC.org. 2017年6月2日閲覧。 ^ "How does the OpenACC API relate to the OpenMP API?". OpenACC.org. 2014年1月14日閲覧。 ^ "How did the OpenACC specifications originate?". OpenACC.org. 2014年1月14日閲覧。 ^ "The OpenMP Consortium Releases First Technical Report". OpenMP.org. 5 November 2012. 2014年1月14日閲覧。 ^ "OpenMP at SC12". OpenMP.org. 29 August 2012. 2014年1月14日閲覧。 ^ a b "OpenACC Group Reports Expanding Support for Accelerator Programming Standard". HPCwire. 20 June 2012. 2012年6月23日時点のオリジナルよりアーカイブ。2014年1月14日閲覧。 ^ "OpenACC Version 2.0 Posted for Comment". OpenACC.org. 12 November 2012. 2014年1月14日閲覧。 ^ "OpenACC 2.0 Spec | www.openacc.org". www.openacc.org. 2016年4月4日時点のオリジナルよりアーカイブ。2016年3月23日閲覧。 ^ "OpenACC Standards Group Announces Release of the 2.5 Specification; Member Vendors Add Support for ARM & x86 as Parallel Devices | www.openacc.org". www.openacc.org. 2016年7月26日時点のオリジナルよりアーカイブ。2016年3月22日閲覧。 ^ "What's new in OpenACC 2.6? | OpenACC". www.openacc.org (英語). 2018年5月1日閲覧。 ^ "What's new in OpenACC 2.7! | OpenACC". www.openacc.org (英語). 2019年1月7日閲覧。 ^ "Cray's views on #OpenACC vs #OpenMP". 2019年5月14日閲覧。 ^ "OpenACC Standard to Help Developers to Take Advantage of GPU Compute Accelerators". Xbit laboratories. 16 November 2011. 2014年1月16日時点のオリジナルよりアーカイブ。2014年1月14日閲覧。 ^ "OpenUH Compiler". 2014年1月25日時点のオリジナルよりアーカイブ。2014年3月4日閲覧。 ^ "OpenARC Compiler". 2014年11月4日閲覧。 ^ a b Larabel, Michael (30 September 2013). "GCC Support Published For OpenACC On The GPU". Phoronix. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明) ^ "accULL The OpenACC research implementation". 2014年1月14日閲覧。 ^ “Omni Compiler”. omni-compiler.org. 2019年11月18日閲覧。 ^ Omni Compiler for C and Fortran programs with XcalableMP and OpenACC directives: omni-compiler/omni-compiler, omni-compiler, (2019-10-17), https://github.com/omni-compiler/omni-compiler 2019年11月17日閲覧。  ^ "IPMACC Compiler". 2017年1月31日閲覧。 ^ Larabel, Michael (4 December 2012). "OpenACC Still Not Loved By Open Compilers". Phoronix. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明) ^ Larabel, Michael (14 November 2013). "OpenACC 2.0 With GPU Support Coming To GCC". Phoronix. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明) ^ Larabel, Michael (15 November 2013). "NVIDIA, Mentor Graphics May Harm GCC". Phoronix. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明) ^ Larabel, Michael (21 November 2013). "In-Fighting Continues Over OpenACC In GCC". Phoronix. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明) ^ https://gcc.gnu.org/wiki/OpenACC ^ Schwinge, Thomas (15 January 2015). "Merge current set of OpenACC changes from gomp-4_0-branch". gcc (Mailing list). gcc.gnu.org. 2015年1月15日閲覧。 ^ Jelinek, Jakub (3 May 2019). "GCC 9.1 Released". LWN. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明) ^ "Easy GPU Parallelism with OpenACC". Dr.Dobb's. 11 June 2012. 2014年1月14日閲覧。 ^ "OpenACC API QuickReference Card, version 1.0" (PDF). NVidia. November 2011. 2014年1月14日閲覧。 ^ "OpenACC standard version 2.0" (PDF). OpenACC.org. 2014年1月14日閲覧。 ^ "OpenACC Kernels and Parallel Constructs". PGI insider. August 2012. 2014年1月14日閲覧。 ^ "OpenACC parallel section VS kernels". CAPS entreprise Knowledge Base. 3 January 2013. 2014年1月16日時点のオリジナルよりアーカイブ。2014年1月14日閲覧。 https://www.openacc.org/ - 公式サイト Usage example from NVIDIA: part1, part2 成瀬彰：「OpenACC で始めるGPUコンピューティング:OpenACC 概要」 成瀬彰：「OpenACCで始めるGPUコンピューティング:ループの並列化」 成瀬彰：「OpenACCで始めるGPUコンピューティング:データ転送の最適化」 成瀬彰：「OpenACCで始めるGPUコンピューティング：ループの最適化」 HPC WORLD / OpenACCとNVIDIA HPC SDKのユーザーコミュニティ OpenACC ディレクティブによるプログラミング 「OpenACCとMPIによるマルチGPUプログラミング入門」(2020年12月22日、東京大学情報基盤センター講習会資料) 「OpenACCとMPIによるマルチGPUプログラミング入門」(2023年6月30日、東京大学情報基盤センター講習会資料) Stéphane Ethier: Introduction to GPU programming with OpenACC, Research Computing Bootcamp (November 1st, 2019) GPU移行（GPU移行に関するポータルサイト） (RIST主催の)HPCプログラミングセミナーで使用する資料の公開ページ ※ OpenACCについては「アクセラレータ入門」の資料を参照。 「GPUプログラミング入門」(東京大学情報基盤センター，第188回お試しアカウント付き並列プログラミング講習会，2022年10月5日資料）