OpenACC ディレクティブによるプログラミング

OpenACC Logo  コンピューティング環境が、従来の CPU だけで処理される時代から変化しようとしています。電力効率の問題を内在しメモリ帯域幅の制約から「CPU 自体の性能向上」が期待できない中で、GPU や DSP と言った、今まで特殊用途のプロセッサを利用し、汎用的な処理を行うソフトウェア環境が整備されつつあります。ここでは、こうした異種プロセッサを活用する「ハイブリッド・コンピューティング」のソフトウェア環境の一つである、OpenACC (Open Accelerator) の使用法に関して纏めます。OpenACCは、2008 年から PGI が取り組んだ PGI Accelerator Programming Model の考え方を踏襲し、2011 年に新しく標準規格化されたものです。OpenMP のようなディレクティブ・ベース(ソース上に指示行を挿入する形態)のプログラミング手法を採用し、GPU だけに限らずアクセラレータ・デバイス上の並列プログラミングを行うための標準規格です。2015年、PGI OpenACC は、GPU上だけではなく、マルチコア CPU 上でも動作するように拡張しました。これによって、OpenACC は CPU のマルチコアから GPU 等のアクセラレータまで対応出来る標準並列プログラミングモデルとなりました。まずは、次世代の「ハイブリッド・コンピューティング」環境を OpenACC を使って試してみることから始めてください。

OpenACC 性能

OpenACCを使用しているユーザ/分野は?

世界中の研究者、科学者、エンジニアは、PGI コンパイラと OpenACC から GPU を使用して、分子動力学、CFD、量子化学、天気と気候、天体物理学などを含むさまざまな分野で 200 を超える最先端のコードを高速化しています。詳細はこちらへgoogle翻訳

1章 アクセラレータを利用したコンピューティング

2章 OpenMP と OpenACC プログラミング・モデル

3章 並列依存性とコンパイル・メッセージ

4章 OpenACC を使って、まず始めてみよう

5章 OpenACC ディレクティブの概説

6章 Accelerator Compute 構文

7章 Data 構文とその他のデータに係わる構文

8章 loop 構文

9章 その他のディレクティブ

10章 OpenACC 2.0/2.5/2.6 の新しい機能、ディレクティブ概要

10 - 1章 Accelerator Compute 領域における Procedure call

10 - 2章 OpenACC 2.0 declare data ディレクティブによるハンドリング

11章 kernels 構文と parallel 構文の違い

12章 OpenACC と CUDA C/Fortran との相互運用性

12 - 1章 OpenACC 上での CUDA Library の利用
(2017.8 New)

12 - 2章 cuSPARSE/OpenACC を利用した線形方程式の反復解法プログラム
(2017.9 New)

12 - 3章 スパース行列の CSR フォーマット変換と CUDA Linear Solver との連携(反復法 BiCGStab)
(2017.10 New)

12 - 4 章 スパース行列用 Linear Solver(直接法 cuSOLVERライブラリ)の利用
(2017.11 New)

13章 非構造化データ領域のデータ管理
(2017.8 New)

14章 C構造体、C++クラス、Fortran派生型のデータ管理
(2017.10 update)

  1. 手動による一般的なディレクティブ指示の方法
  2. deepcopy 機能を使った場合のディレクティブ指示の方法
  3. CUDA Unified Memory を利用した場合のディレクティブ指示の方法
  • Fortran 派生型変数の使用例2
    1. 手動による一般的なディレクティブ指示の方法
    2. full deepcopy 機能を使った場合のディレクティブ指示の方法
    3. CUDA Unified Memory を利用した場合のディレクティブ指示の方法
  • OpenACC における C 構造体データ
    1. 手動による一般的なディレクティブ指示の方法
    2. CUDA Unified Memory を利用した場合のディレクティブ指示の方法
  • OpenACC における C++ クラスデータ
    1. 手動による一般的なディレクティブ指示の方法
  • C 構造体データを使用したプログラムのポーティング・チュートリアル
    1. ① ベースとなるプログラム(構造体をポインタ変数ではない実体変数として宣言)
    2. ② ベースを OpenACC でデバイスコード化(構造体をポインタ変数ではない実体変数として宣言)
    3. ③ ②のプログラムをプロシジャに分離(構造体をポインタ変数ではない実体変数として宣言)
    4. ④ スカラ構造体をポインタ変数として宣言
    5. ⑤【最終形】 構造体を利用する場合の OpenACCプ ログラム
  • 15章 CUDA Unified Memory with OpenACC
    (2017.8 New)

    16章 OpenACC with MPI