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

OpenACC
最新版
3.3 / 2022年11月 (1年前) (2022-11)[1]
プログラミング
言語
C, C++, Fortran
対応OS クロスプラットフォーム
プラットフォーム クロスプラットフォーム
種別 API
公式サイト www.openacc.org
テンプレートを表示

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

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

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

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

2012年11月12日、SC12(2012年のスーパーコンピューティング会議)において、OpenACCバージョン2.0の草案が発表された[9] 。 新しく提案された機能は、データ移動における新しい制御(非構造化データの取り扱いの改善と不連続メモリ対応の改善のような)、明示的な関数呼び出し、そして分割コンパイル(高速化コードライブラリの作成と再利用を可能にする)という機能を含んでいる。OpenACC 2.0は2013年1月に公式にリリースされた[10]

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

2019年4月3日にジョン・レベック(クレイの中核研究拠点クレイスーパーコンピューティングセンターの所長)は、「クレイはCCE/9.0におけるOpenACCのサポートを終了する」と発表した [14]

コンパイラのサポート 編集

OpenACCは、商用コンパイラとして利用可能である。PGI(コンパイラバージョン12.6から)とクレイ(同社のハードウェアのみ)がサポートを行っている[8][15]

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

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

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

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

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

使用方法 編集

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

ディレクティブ 編集

OpenACCは、プラグマ(ディレクティブ)の幅広いリストを定義している[32]。例えば、

 #pragma acc parallel
 #pragma acc kernels

別個のセマンティクス(意味論)を用いて、上の2行はアクセラレーター上で実行される並列な計算カーネル(ここで言うカーネルはOSの中心部ではなくて、アクセラレーター上で実行される計算プログラムのこと)を定義するために使われる[33][34]

 #pragma acc data

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

 #pragma acc loop

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

 #pragma acc cache
 #pragma acc update
 #pragma acc declare
 #pragma acc wait

ランタイム 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から構成され、多くの処理要素を操作する(OpenCLのworkgroupに相当)。

関連項目 編集

出典 編集

  1. ^ The OpenACC® Application Programming Interface Version 3.3 | OpenACC-Standard.org
  2. ^ "Nvidia, Cray, PGI, and CAPS launch 'OpenACC' programming standard for parallel computing". The Inquirer. 4 November 2011. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明)
  3. ^ "OpenACC standard version 2.5" (PDF). OpenACC.org. 2017年6月2日閲覧
  4. ^ "How does the OpenACC API relate to the OpenMP API?". OpenACC.org. 2014年1月14日閲覧
  5. ^ "How did the OpenACC specifications originate?". OpenACC.org. 2014年1月14日閲覧
  6. ^ "The OpenMP Consortium Releases First Technical Report". OpenMP.org. 5 November 2012. 2014年1月14日閲覧
  7. ^ "OpenMP at SC12". OpenMP.org. 29 August 2012. 2014年1月14日閲覧
  8. ^ a b "OpenACC Group Reports Expanding Support for Accelerator Programming Standard". HPCwire. 20 June 2012. 2012年6月23日時点のオリジナルよりアーカイブ。2014年1月14日閲覧
  9. ^ "OpenACC Version 2.0 Posted for Comment". OpenACC.org. 12 November 2012. 2014年1月14日閲覧
  10. ^ "OpenACC 2.0 Spec | www.openacc.org". www.openacc.org. 2016年4月4日時点のオリジナルよりアーカイブ。2016年3月23日閲覧
  11. ^ "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日閲覧
  12. ^ "What's new in OpenACC 2.6? | OpenACC". www.openacc.org (英語). 2018年5月1日閲覧
  13. ^ "What's new in OpenACC 2.7! | OpenACC". www.openacc.org (英語). 2019年1月7日閲覧
  14. ^ "Cray's views on #OpenACC vs #OpenMP". 2019年5月14日閲覧
  15. ^ "OpenACC Standard to Help Developers to Take Advantage of GPU Compute Accelerators". Xbit laboratories. 16 November 2011. 2014年1月16日時点のオリジナルよりアーカイブ。2014年1月14日閲覧
  16. ^ "OpenUH Compiler". 2014年1月25日時点のオリジナルよりアーカイブ。2014年3月4日閲覧
  17. ^ "OpenARC Compiler". 2014年11月4日閲覧
  18. ^ a b Larabel, Michael (30 September 2013). "GCC Support Published For OpenACC On The GPU". Phoronix. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明)
  19. ^ "accULL The OpenACC research implementation". 2014年1月14日閲覧
  20. ^ Omni Compiler”. omni-compiler.org. 2019年11月18日閲覧。
  21. ^ 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日閲覧。 
  22. ^ "IPMACC Compiler". 2017年1月31日閲覧
  23. ^ Larabel, Michael (4 December 2012). "OpenACC Still Not Loved By Open Compilers". Phoronix. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明)
  24. ^ Larabel, Michael (14 November 2013). "OpenACC 2.0 With GPU Support Coming To GCC". Phoronix. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明)
  25. ^ Larabel, Michael (15 November 2013). "NVIDIA, Mentor Graphics May Harm GCC". Phoronix. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明)
  26. ^ Larabel, Michael (21 November 2013). "In-Fighting Continues Over OpenACC In GCC". Phoronix. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明)
  27. ^ https://gcc.gnu.org/wiki/OpenACC
  28. ^ 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日閲覧
  29. ^ Jelinek, Jakub (3 May 2019). "GCC 9.1 Released". LWN. {{cite web}}: Cite webテンプレートでは|access-date=引数が必須です。 (説明)
  30. ^ "Easy GPU Parallelism with OpenACC". Dr.Dobb's. 11 June 2012. 2014年1月14日閲覧
  31. ^ "OpenACC API QuickReference Card, version 1.0" (PDF). NVidia. November 2011. 2014年1月14日閲覧
  32. ^ "OpenACC standard version 2.0" (PDF). OpenACC.org. 2014年1月14日閲覧
  33. ^ "OpenACC Kernels and Parallel Constructs". PGI insider. August 2012. 2014年1月14日閲覧
  34. ^ "OpenACC parallel section VS kernels". CAPS entreprise Knowledge Base. 3 January 2013. 2014年1月16日時点のオリジナルよりアーカイブ。2014年1月14日閲覧

学習用参考図書 編集

外部リンク 編集