OpenACC

最終更新日:2019年1月15日

OpenACCは、GPU等のアクセラレータ向けの共通プログラミングインターフェイスです。 OpenMPと同様に、C/C++言語やFortranで記述されたプログラムに対して並列化に関するヒントを指示文(ディレクティヴ)を用いて記述することで、 アクセラレータを用いて並列計算を行うプログラムを容易に作成することができます。
OpenACCの言語仕様や使用法、サンプルプログラム等については以下をご参照ください。


利用環境

システム・バージョン・利用範囲

  • サブシステム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の組み合わせについては外部サイト等を参考にしてください。