OpenACC
最終更新日:2019年1月15日
OpenACCは、GPU等のアクセラレータ向けの共通プログラミングインターフェイスです。
OpenMPと同様に、C/C++言語やFortranで記述されたプログラムに対して並列化に関するヒントを指示文(ディレクティヴ)を用いて記述することで、
アクセラレータを用いて並列計算を行うプログラムを容易に作成することができます。
OpenACCの言語仕様や使用法、サンプルプログラム等については以下をご参照ください。
- Homepage | OpenACC
- OpenACC: More Science Less Programming | NVIDIA Developer
- OpenACC Getting Started Guide
- PGIコンパイラ
利用環境
システム・バージョン・利用範囲
- サブシステムB
- 基本フロントエンド
- 大容量フロントエンド
バージョン | 九州大学構成員 | 学術研究機関構成員 | 民間利用の方 |
---|---|---|---|
17.7 | 〇 | ||
16.5 | 〇 |
バージョン | 九州大学構成員 | 学術研究機関構成員 | 民間利用の方 |
---|---|---|---|
17.7 | 〇 | ||
16.5 | 〇 |
バージョン | 九州大学構成員 | 学術研究機関構成員 | 民間利用の方 |
---|---|---|---|
17.7 | 〇 | ||
16.5 | 〇 |
利用方法
環境設定
OpenACCプログラムのコンパイルにはPGIコンパイラ(pgcc, pgc++, pgfortran)を使用します。
$module load pgi/17.7 |
プログラムの作成とコンパイル
OpenACC のプログラムを格納するファイル独自の拡張子は定められていません。 通常のC/C++言語やFortran向けの拡張子から変更する必要はありません。
OpenACCプログラムのコンパイルは以下のように行います。
C/C++言語の場合(ソースプログラム: test.c, 実行ファイル: test)
$ pgcc -Minfo=acc -acc -ta=tesla,cc60 -tp=haswell -o test test.c |
Fortranの場合(ソースプログラム: test.f90, 実行ファイル: test)
$ pgfortran -Minfo=acc -acc -ta=tesla,cc60 -tp=haswell -o test test.f90 |
バッチジョブでのプログラム実行方法
コンパイルされたプログラムは、通常のコマンドと同様にジョブスクリプトに記述して実行できます。 コンパイル時と同様にmodule load pgi/17.7を行っておく必要があります。
#!/bin/bash #PJM -L "vnode=1" #PJM -L "vnode-core=36" #PJM -L "rscunit=ito-b" #PJM -L "rscgrp=ito-g-4" #PJM -L "elapse=1:00" module load pgi/17.7 ./test |
主なコンパイルオプション
OpenACCプログラムをコンパイルする際の、pgcc/pg++/pgfortranの主なコンパイルオプションは以下のとおりです。 -helpオプションを指定することで各オプションの説明を見ることもできます。
コンパイルオプション | 説明 |
---|---|
-Mcuda=options | OpenACCにより並列化される部分を実行するアクセラレータのアーキテクチャに関する情報を指定する。 サブシステムB・基本フロントエンド向けの基本的なオプションは-Mcuda=cc60、大容量フロントエンド向けは-Mcuda=cc50。 |
-tp=options |
OpenACCにより並列化される部分以外を実行する対象ハードウェアのアーキテクチャに関する情報を指定する。
本システムにおいては常に-tp=haswellを指定すれば良い。
(Community Editionの PGIコンパイラ、バージョン 18.1以降を利用する場合は、skylakeを指定する。)) |
-Minfo=options | コンパイラによる処理の内容を表示するためのオプション。 OpenACC使用時には-Minfo=accを指定しておくと各並列化対象範囲についての情報が得られる。 |
他の並列化手法との組み合わせ
OpenACCプログラムは、OpenMPプログラムと併用することでCPU部とGPU部それぞれを並列化したり、
MPIを用いて複数ノード実行させたりすることもできます。
OpenMPやMPIの利用方法についてはPGIコンパイラを参照してください。
OpenACCとCUDAの組み合わせについては外部サイト等を参考にしてください。