NVIDIA GPU 上の PGIアクセラレータ™ コンパイラ

姫野ベンチマークが指示行挿入だけで、20GFLOPS!

対象 GPGPU Fortranプログラミング

キーワード 姫野ベンチマーク、PGIアクセラレータ ディレクティブの挿入

 NVIDIA社の CUDA™ 環境を備えた GPGPU 対応のコンパイラ機能を含めた PGIアクセラレータ™ コンパイラを使用して、Host+GPU 用の実行モジュールを作成します。アプリケーションの中で GPGPU へオフロードしたいループ領域をコンパイラ指示行(ディレクティブ、プラグマ)で指定する、PGIアクセラレータ・プログラミングモデル(Implicit Model)を利用します。ここでは、ポアソン方程式解法をヤコビの反復法で解く「姫野ベンチマーク」を題材に、PGI のアクセラレータ・ディレクティブを使用して、実際にGPUによる加速性能を確認した。使用したコードは、Fortran90 用に記述された himenoBMTxp.f90 で、現状の PGI 9.0-3 に実装されているプレビューバージョンの限られたディレクティブ機能だけを使って、Mモデルで約 20GFLOPS の実効性能を記録しました。これは、使用した Intel(R) Core2 ホスト性能の 15.9 倍に相当します。今後、11月に正式にリリースされる製品では、さらに最適化余地のあるディレクティブも実装される予定のため、さらなる実効性能の向上が期待できます。
2009年9月1日 Copyright © 株式会社ソフテック 加藤

PGI 2010 バージョンによる姫野ベンチマーク性能との最適化手順についてはこちらへどうぞ

NIVIA GPU システムハードウェア環境とPGIアクセラレータコンパイラ環境

 姫野ベンチマークを実施したシステム環境は、以下の通りです。

ホスト側プロセッサ Intel(R) Core2 Duo E6600 2.40GHz FSB 1066MHz
ホスト側メモリ PC5300 DDR-2 1GB 667MHz
ホスト側 OS OpenSUSE 11.1、カーネル 2.6.27.7-9
PGI コンパイラ PGI 9.0-3
NVIDIA GPU GeForce GTX 280
GPU Device Memory 1 GB
言語 / ソフトウェア Fortran 90 / himenoBMTxp.f90 Mサイズ (256x128x128)

NVIDIA GPGPU のハードウェア仕様

 PGIのコマンドには、システムに搭載しているGPUのハードウェア仕様情報を出力するコマンド pgaccelinfo があります。その情報は以下の通りです。この中で下線で示したものは、ホスト側から GPU のデバイスメモリへのデータ転送バンド幅です。最新のものは、この数字よりも良いと思われますが、ほぼ 1000MB/sec 台であることが分かります。これは、今となっては低速なバンド幅と言えます。GPUへは、この転送レートでデータを移動することになります。また、GPUの初期化オーバーヘッドは、約 1 秒程度であることが分かります。

photon28:~/GPGPU/Himeno> pgaccelinfo -v

Device Number:                 0
Device Name:                   GeForce GTX 280
Device Revision Number:        1.3
Global Memory Size:            1073414144
Number of Multiprocessors:     30
Number of Cores:               240
Concurrent Copy and Execution: Yes
Total Constant Memory:         65536
Total Shared Memory per Block: 16384
Registers per Block:           16384
Warp Size:                     32
Maximum Threads per Block:     512
Maximum Block Dimensions:      512 x 512 x 64
Maximum Grid Dimensions:       65535 x 65535 x 1
Maximum Memory Pitch:          262144B
Texture Alignment              256B
Clock Rate:                    1296 MHz
Initialization time:           1009395 microseconds
Upload time:                   2542 microseconds (4 megabytes)
Download time:                 3306 microseconds (4 megabytes)
Upload bandwidth:              1650 MB/sec (4 megabytes)
Download bandwidth:            1268 MB/sec (4 megabytes)

PGIアクセラレータ™ Fortran の指示行だけで、姫野ベンチが 20GFLPOS

 以下の姫野ベンチマークの結果は、PGIアクセラレータ™ Fortran 95 コンパイラを使用して、姫野ベンチマークコードの中に、GPU 計算用のコンパイラ指示行を挿入するだけで得た性能です。プログラムの実施条件は、GPUのメモリサイズの制約から Mサイズデータを使用しました。また、ヤコビの反復は 800 回と固定し、誤差計算は、最後 800回目の 1 回のみで行っております。なお、これは毎回行ったとしても大きな性能差はありません。

【GPUを利用した場合】
mimax=          257  mjmax=          129  mkmax=          129
imax=          256  jmax=          128  kmax=          128
Time measurement accuracy : .10000E-05
Start rehearsal measurement process.
Measure the performance in 3 times.
initialize nvidia
   MFLOPS:    1529.042       time(s):   0.2690020000000000        1.6921854E-03
Now, start the actual measurement process.
The loop will be excuted in          800  times.
This will take about one minute.
Wait for a while.
  Loop executed for           800  times
  Gosa :   8.3685847E-04
  MFLOPS:    20457.79       time(s):    5.361483000000000
  Score based on Pentium III 600MHz :    246.9555

 NVIDIA社の GPU を使用して、姫野ベンチマークやその他の数値計算カーネルの性能を実測する試みは、既に多数報告されています(下記(1),(2)等)。そのプログラム実装は、CUDA C を使用した実装であり、低レベルの次元で明示的なプログラミングと最適化を行い、直接 GPU の制御を行って得た性能です。このような実装で、GeForce GTX 280の 1GPU を使用した場合、40GFLOPS ~ 70GFLOPS の性能が報告されています。一方、こうした難易なプログラミングと最適化を行わない方法、すなわち、PGIアクセラレータ™ のコンパイラ指示行のみで GPU へ計算処理のオフロードを行うと、20GFLOPS 程度の性能が得られることが実証されました。この実効性能の評価については、いろいろな考え方があるのですが、ユーザがプログラミング可能な簡単な方法と環境がなければ、過去の歴史が物語るように、こうした「アクセラレータ用途のハードウェア」は一時のブームに終わってしまうことになります。こう言った意味で、PGIアクセラレータコンパイラは、より多くのユーザに対して、多くの恩恵をもたらすことになるでしょう。
(参考文献)
(1) 小川慧、青木尊:CUDA による定常反復 Poisson ベンチマークの高速化、情報処理学会研究会報告会、2008-HPC-115, pp.19-23 (2008)
(2) 成瀬彰、住元真司、久門耕一:GPGPU上での流体アプリケーションの高速化手法、「ハイパフォーマンスコンピューティングと計算化学シンポジウムHPCS2009」、pp.115-122 (2009)

 ホスト側で 1 スレッド(CPU)実行した場合の性能結果を以下に示します。このベンチマークは、メモリバンド幅に大きく依存しますが、このシステムの場合、ほぼ 1.28GLOPS 程度の性能となります。上記 GPGPU による性能は、このホスト性能に対して約15倍程度の高速化が得られたことになります。ホスト側の性能は、x64 ホスト側のプロセッサとそのマイクロアーキテクチャ上で、多くのマルチコアを使用してスレッド並列を行ったとしても、どうしても「キャッシュ」を経由することによる性能の律速ポイントが生じます。キャッシュに収まらない大きなデータサイズになればなるほど、性能が飽和する可能性があります。また、ホスト側のマルチコア上のOpenMPスレッド並列での問題の一つとして、プロセッサの共有キャッシュを利用する際の「偽共有」による並列性能の大幅な低下を来すことも、よく見られる現象です。プロセッサが many cores になればなるほど、スレッド並列効果を妨げる問題が露出してきます。一方、GPUによる(超)データ並列処理では、その動作アーキテクチャに、こうした大掛かりなキャッシュメカニズムは存在しないため、「データ並列」が可能で多くの処理実体を有するプログラムであれば、大きなデータサイズであればあるほど、大きな性能を期待できるということが言えます。もちろん、解析のデータサイズはGPUのデバイスメモリのサイズに依存しますが。。。

【x64ホスト側の性能】
mimax=          257  mjmax=          129  mkmax=          129
imax=          256  jmax=          128  kmax=          128
Time measurement accuracy : .10000E-05
Start rehearsal measurement process.
Measure the performance in 3 times.
   MFLOPS:    1221.724       time(s):   0.3366680000000000        1.6941389E-03
   Now, start the actual measurement process.
The loop will be excuted in          800  times.
This will take about one minute.
Wait for a while.
  Loop executed for           800  times
  Gosa :   8.3791913E-04
  MFLOPS:    1281.600       time(s):    85.58373200000000
  Score based on Pentium III 600MHz :    15.47079

 次の記事では、実際に姫野ベンチマークプログラムへのディレクティブの適用と簡単なディレクティブ・チューニングの実際を解説することにします。

PGI GPU 用コンパイラ情報サイト