第6回:プログラムの実行時間を確認しよう

前回は、拡散方程式のプログラムを例として、OpenACCのコンパイラが出力するメッセージについて学びました。

​今回は、OpenACCプログラムを実行した際の、プログラムの性能の確認方法について学びます。

プログラムの実行時間を確認しよう

GPUを使う上で必ず考えなければならないのが、プログラムの実行速度です。
今あるプログラムを速くするためにわざわざOpenACC化を進めているわけですから、遅かったら意味がないのです。

では、プログラムの実行時間はどのように確認したらよいでしょうか?
拡散方程式のプログラム(サンプルプログラム) を例として、いくつか紹介します。

  • gettimeofday 関数を使う

gettimeofday関数は、その名の通り現在時刻を得るための関数で、sys/time.hをincludeすることで利用可能なC言語の標準機能です。

オーバーヘッド(時間計測そのものにかかる余分な時間)も比較的少なく、よく使われる手法です。
​サンプルプログラム 内でも使っています(図1)。

標準機能なのでどこでも使えますし、CPU実装と速度を比較する際などにも便利です。

図1a:gettimeofday関数
図1b:gettimeofday関数
図1:gettimeofday関数を使った自作タイマー関数の例
  • MPI_WTIME 関数や omp_get_wtime 関数を使う

MPI_WTIMEはMPIプログラムの、omp_get_wtimeはOpenMPプログラムのために用意された、時間計測関数です。

MPIとOpenMPは、どちらもCPU向けの並列プログラミングモデルですが、それらを利用していないプログラムでも、ヘッダファイルの読み込みなどにより利用可能です。

gettimeofday関数の無いFortranプログラムの時間計測によく用いられます。
Fortranプログラムで利用する例を図2に示します。MPI_WTIMEも似たような使い方が可能です。

図2:omp_get_wtime関数
図2:omp_get_wtime関数を使った自作タイマー関数(Fortran)の例
  • 環境変数PGI_ACC_TIMEを使う

上記二つは一般的な時間計測方法でしたが、PGIコンパイラの機能として提供されている、OpenACC向けの方法についても紹介します。

ここからが今回のメインの話です。使い方は簡単で、環境変数 PGI_ACC_TIME を 1にセットするだけです。Bash環境なら、
$ export PGI_ACC_TIME=1
$ ./a.out
のようにして使います。

ただし計測のオーバーヘッドがgettimeofday関数などと比べると大きいため、計測時以外は0にしておくことをお勧めします。

PGI_ACC_TIMEが1にセットされていると、標準エラー出力に図3のような出力が得られます。

​図3は、CPU-GPU間のデータ転送が最小化されていない、拡散方程式プログラムを動かした場合です。

図3:PGI_ACC_TIME
図3:PGI_ACC_TIMEを使った際の出力例

PGI_ACC_TIMEを1にセットした場合、OpenACCに関する実行時の情報が出力されます。

OpenACCの指示文が含まれる関数名と、そこでkernelsが何回実行されたか、スレッドはどのくらい使われたか、実行時間はどうだったか、データ転送の時間や回数はどうか。といった情報を得ることができます。

この例の場合、kernels指示文による計算本体の実行時間と比べて、データ転送時間が数十倍となっており、データ転送の最小化が必要であることがすぐにわかります。

  • NVIDIA Visual Profiler を使う

NVIDIA Visual Profiler とは、CUDA向けに開発された、性能解析ツールです。
OpenACCのプログラムでもこれを利用することができます。

非常に優れたツールで、細かい実行時情報がたくさん得られるのですが、それらの細かい情報を得てもOpenACCでは改善しようがないことが多いため、現段階では非推奨です。

本コラムでは、最終的にはOpenACCとCUDAを組み合わせて使うことを推奨しておりますので、その時にまた紹介したいと思います。

今回は、GPUプログラミングとは切っても切れない性能評価方法について紹介しました。

プログラムを高速化するためには避けては通れませんので、是非試してみてください。

1ヵ月間有効のスパコンお試しアカウント

東京大学情報基盤センターでは、教育の一環として、制限はあるものの一ヵ月の間有効なスパコンアカウントを提供しています。

現在3つのスパコンが運用されていますが、そのうちReedbushと呼ばれるスパコンには、一世代前のものではありますがGPUが搭載されていて、OpenACCを使える環境も整っています。

自分でどんどん自習したい場合は、ご利用を考えてみてください。

トライアルアカウント申し込みページ
https://www.cc.u-tokyo.ac.jp/guide/trial/free_trial.php

< 過去の講習会の資料やプログラム公開中 >

東大センターが行った過去のOpenACCに関する講習会の資料やプログラムも公開されていますので、自習する場合にはぜひご利用ください。オンライン講習会 定期開催中!

講習会ページ
https://www.cc.u-tokyo.ac.jp/events/lectures/

講習会で用いているプログラム
https://www.dropbox.com/s/z4fmc4ibdggdi0y/openacc_samples.tar.gz?dl=0​