• トップ
  • G-DEPについて
  • ご購入ガイド
  • サポート
  • お問い合わせ

G-DEPトップ  >  G-DEPの高速演算記  >  高速演算記 第24回 「Kepler解説その1 〜サンプルプログラムで見るパフォーマンス〜」

高速演算記 第24回 「Kepler解説その1 〜サンプルプログラムで見るパフォーマンス〜」

はじめに

2012年末、NVIDIA社よりHPC向け新Kepler世代Tesla「K20ファミリー」がリリースされました。同時に、それらが備える新機能を活用するための最新の開発環境「CUDA5」もリリースされました。そこでG-DEP高速演算記では、Kepler世代TeslaとCUDA5の概要を何回かの記事に渡ってご紹介していきます。今回の記事では、スペックの確認、及び、サンプルプログラムでの実行性能ベンチマークを通じて、新Kepler世代と旧Fermi世代とを比較し、Kepler世代の優れた性能を確認していきたいと思います。

 

Tesla K20ファミリーの機種

まず、Kepler世代Teslaの機種から確認しておきましょう。Kepler世代Teslaには、K10、K20c、K20m、K20Xの4機種があります。但し、この内のK10は単精度演算に特化したTeslaであり、本コラムでは扱いません。本コラムの対象となるのは、これ以外のK20c、K20m、K20Xの3機種です。この3機種が倍精度演算に重点を置いたTeslaとなります。

K20cとK20mのスペックは同じです。そのため、どちらも単にK20と呼ばれています。しかし、K20cは自身に冷却ファンを持ち、K20mはファンを持たないという違いがあります。つまり、K20cはワークステーション用で、K20mはラックマウント用です。K20mはラックマウントの強力な冷却ファンで冷却する必要があるわけです。NVIDIAのドライバダウンロードページのプルダウンメニューでも、これら2機種は区別されています。ドライバをご自身でインストールされる際には、適切な方をご選択下さい。

K20XはハイエンドのTeslaで、また、K20mと同じくファンを持たないラックマウント用です。2013年3月現在の世界スパコン・ランキングで1位の米オークリッジ国立研究所のスパコン「Titan」の演算性能の基盤となっているのが、このK20Xです。なお、K20cは単品でも販売されていますが、K20mとK20Xは単品では販売されていません。

機種 用途 使用環境
K10 単精度演算 ラックマウント
K20c 倍精度演算 ワークステーション
K20m 倍精度演算 ラックマウント
K20X  倍精度演算
ラックマウント

 

スペックの比較

次の表は旧Fermi世代Tesla C2075とM2090、及び新Kepler世代Tesla K20cとK20m、K20Xの主要なスペックの一覧表です。

  C2075 M2090 K20c, K20m K20X
世代 Fermi Fermi Kepler Kepler
コアクロック周波数 1.15 GHz 1.30 GHz 706 MHz 732 MHz
SM / SMX 14 SM 16 SM 13 SMX 14 SMX
単精度CUDAコア数 448 基 512 基 2496 基 2688 基
単精度演算 ピーク性能 1.03 TFlop/s 1.33TFlop/s 3.52 TFlop/s 3.94 TFlop/s
倍精度ユニット数 (224 基) (256 基) 832 基 896 基
倍精度演算 ピーク性能 515 GFlop/s 666 GFlop/s 1.17TFlop/s 1.31 TFlop/s
メモリクロック周波数 1.5 MHz 1.85 MHz 2.6 MHz 2.6 MHz
メモリ I/O 384 bit 384 bit 320 bit 384 bit
最大メモリバンド幅 144 GB/s 177 GB/s 208 GB/s 250 GB/s
メモリサイズ 6 GB 6 GB 5 GB 6 GB
L1 キャッシュ+ shared 64 KB/SM 64 KB/SM 64 KB/SMX 64 KB/SMX
L2キャッシュ 768 KB 768 KB 1536 KB 1536 KB
LD/ST ユニット 16基/SM 16基/SM 32基/SMX 32基/SMX
システムインターフェース PCIe 2.0 PCIe 2.0 PCIe 2.0 PCIe 2.0
Compute Capability 2.0 2.0 3.5 3.5
TDP ~215W ~225W ~225W ~235W

 

このスペック表を見れば、Kepler世代が優れた性能を持つ事が一目瞭然です。まず、演算ピーク性能が大きく向上している事がわかります。Fermi世代以降、NVIDIA GPUの各コアが1クロックで行える最大演算回数は、積和を同時に行うFMA命令(Fused Multiply-Add命令, x×y+z)で実行できる2回(2Flop)です。このため、ピーク性能は次式で計算されています:

      ・単精度演算 ピーク性能 [Flop/s] = コアクロック周波数 [Hz] × 単精度CUDAコア数 × 2 Flop(FMA)

      ・倍精度演算 ピーク性能 [Flop/s] = コアクロック周波数 [Hz] × 倍精度ユニット数 × 2 Flop(FMA)

スペック表と上式を照らし合わせると、Kepler世代ではFermi世代に比べてコアクロック周波数を落とす代わりにコア数を増やして演算性能を上げている事がわかります。FMA命令も含め、Kepler世代もFermi世代と同じく、単精度演算と倍精度演算の両方が IEEE 754-2008完全準拠 となっています。なお、Fermi世代では単精度CUDAコア2基を倍精度ユニット1基として動作させていましたが、Kepler世代では単精度CUDAコアとは別に倍精度ユニットが搭載されています。この点もKepler世代での大きな変更点です。

さて、プログラムの実行性能を [Flop/s] = [Flop/Byte] × [Byte/s]と書けばわかるように、実際に重要となるハードウェア・スペックは、演算ピーク性能よりもむしろメモリバンド幅 [Byte/s]です。スペック表に載っているその最大値は次式で計算されています:

      ・最大メモリバンド幅 [Byte/s] = メモリクロック周波数 [Hz] × メモリ I/O [bit] /8 × 2(DDR)

スペック表を見れば、Kepler世代ではメモリクロック周波数を増加させて最大メモリバンド幅を増加させている事がわかります。C2075からK20cにかけては、最大メモリバンド幅は約1.4倍上昇しています。このため、C2075をK20cに交換し、アルゴリズム( [Flop/Byte] ) は変更しなければ、実行性能は大体1.4倍程高速化されると思われます。もちろん、これは単なる目安にすぎません。共有メモリを有効活用していたり、Fermi世代以降に搭載されたL1/L2キャッシュが効いていたり、あるいはホスト-デバイス間通信を頻繁に行っていたりすれば話がそう単純ではないためです。また、Kepler世代では1スレッドがアクセスできるレジスタ数が増えたり、いくつかの新機能も追加されているため、より効果的な高速化を考える事も可能です。実際、後述の倍精度密行列積では3倍程度の高速化を確認できます。

            GK110の写真                     GK110の設計図

 
両世代のTeslaのアーキテクチャの違いにもう少し踏込んでみます。Fermi世代Teslaの中にはGF110というチップがあり、そこに SM(Streaming Multiprocessor)と呼ばれるプロセッサが16個搭載されていました。C2075ではその内の14個のみが動作するように制御されており、M2090では16個全てが動作できていました。これに対し、Kepler世代Tesla内にあるのは上の写真のチップ "GK110" です。設計図に記されているように、ここにSMX(Streaming Multiprocessor eXtreme)なる新プロセッサが#0〜#14の15個搭載されています。K20cとK20mではその内の13個しか動作しないように制御がかかっていますが、Tesla K20Xでは14個が動作しますし、将来的には15個全てが動作するTeslaが発売されるかもしれません。

 

         

    Fermi世代のSM                           Kepler世代のSMX

 
上図はFermi世代TeslaのSMとKepler世代TeslaのSMXの概略図です。単精度CUDAコアは緑色のCoreと書かれている部分です。SMには単精度CUDAコアが32基あり、C2075にはSMが14個、M2090にはSMが16個搭載されているので、それぞれの単精度CUDAコアの総数は、C2075で32基×14SM=448基、M2090で32基×16SM=512基となっていました。一方、SMXには単精度CUDAコアが192基あり、K20cにはSMXが13個、K20XにはSMXが14個搭載されているので、それぞれの単精度CUDAコアの総数は、K20で192基×13SMX=2496基、K20Xで192基×14SMX=2688基となります。
 
倍精度ユニットに関しては、Fermi世代では単精度CUDAコア2基を倍精度ユニット1基として動作させていたので、C2075は448基÷2=224基、M2090は512基÷2=256基備えていた事になります。一方、SMXには単精度CUDAコアとは別に倍精度ユニットが64基搭載されています。上図のSMXの黄色いユニットがそれです。このため、K20cは倍精度ユニットを64基×13SMX=832基、K20Xは64基×14SMX=896基備えている事になります。

 

サンプルプログラムによる実効性能測定

では、C2075とK20cで実際にプログラムを実行し、性能差を見ていきましょう。今回はCUDAのサンプルプログラム集からいくつかピックアップしてみます。(CentOSでは、これらのプログラムはデフォルトでは /usr/local/cuda-5.0/samples 以下にあります。)先に結果を言ってしまうと、いずれもK20にて実行性能の上昇が見られます。なお、この測定はG-DEPのマシンMAS-i7WZで実行しました。C2075もK20cもCUDA5で利用し、また、いずれもECC disabledにして測定しています。

              テストマシン   G-DEP MAS-i7WZ                                              環境: CentOS 6.3 (final, 64bit)+CUDA 5                                     M/B: Intel X79Express チップセット                                       CPU: Intel core i7-3930K                                            GPU: NVIDIA C2075 + K20c(いずれもECC disabledに設定)                           メインメモリ: 32 GB

まず、最も気になるメモリバンド幅の実効性能をサンプルプログラムの bandwidthTest で測定してみましょう。コマンド『# ./bandwidthTest --dtod』 で測定した結果は以下のようになりました。先のスペック表で見た最大メモリバンド幅のみならず、実効性能でもK20cはC2075の約1.4倍を達成している事がわかります。ちなみに、これは転送データサイズが32MBの場合での実効性能となります。

  C2075 K20c
BandWidth 119 GB/s 162 GB/s

 

コマンド『# ./bandwidthTest --mode=shmoo --dtod』で広範囲に渡って測定した結果が次のグラフです。通常利用される数MB以上の転送サイズの範囲では、転送サイズが変わってもK20cが優位である事が確認できます。

      

次は演算性能の評価のために、nbody、matrixMul、matrixMulCUBLASを実行してみましょう。結果は以下のようになり、K20の優れた性能を確認できます。なお、各ソースコードのダウンロード・ページへのリンクも張っていますので、どの部分を時間測定しているのかはそちらからご確認頂けます。

 

nbodyによる演算性能の測定(コマンド『# ./nbody –benchmark –numbodies=13312』で測定)

  C2075 K20c
単精度 452 GFlop/s 1.05 TFlop/s
倍精度(-fp64追加) 229 GFlop/s 467 GFlop/s

 

nbodyは目に見えて高速に!

 

matrixMul(単精度)

  C2075 K20c
Performance 170 GFlop/s 244 GFlop/s

 

matrixMulCUBLAS(単精度)

  C2075 K20c
Performance 521 GFlop/s 1.14 TFlop/s

 

matrixMulCUBLASを倍精度演算(cublasDgemm)に修正して測定

  C2075 K20c
Performance 270 GFlop/s 771 GFlop/s

 

画像処理系のサンプルプログラムの実行性能も見てみましょう。ここでもK20の優れた性能を確認できます。

 

convolutionFFT2D

  C2075 K20c
built-in R2C/C2R 1345 MPix/s 1886 MPix/s
custom R2C/C2R 1345 MPix/s 1877 MPix/s
updated custom R2C/C2R 1649 MPix/s 2313 MPix/s

 

recursiveGaussian

  C2075 K20c
Processing time 744 ms 701 ms

 

stereoDisplay

  C2075 K20c
Pixel throughput 132 Mpixel/s 171 Mpixel/s


grabcutNPP

  C2075 K20c
Elapsed Time 71.1 ms 63.8 ms

 

grabcutNPPによる美しい描写

 

乱数・モンテカルロシミュレーション系のサンプルプログラムでは以下のようなスループットを得ました。やはり、K20のハイパフォーマンスを確認できます。

 

quasirandomGenerator

  C2075 K20c
QRNG 3.17 GNumbers/s 5.79 GNumbers/s
InverceCNDgpu()  4.85 GNumbers/s 18.7 GNumbers/s

 

MersenneTwisterGP11213

  C2075 K20c
Throughput 2.78 GNumbers/s 3.01 GNumbers/s

 

BlackScholes

  C2075 K20c
Effective memory bandwidth 50.1 GB/s 116 GB/s
Throughput 5.01 GOptions/s 11.6 GOptions/s

 

binomialOptions

  C2075 K20c
Throughput 18594 Options/s 25847 Options/s

 

以上、サンプルプログラムをC2075とK20cで実行し、比較してきました。この結果から、スペックだけでなく、実行性能においてもK20cが優れている事がよくわかります。

次回の記事ではKepler世代Teslaの新機能を活かしたチューニングについて報告したいと思います。

(G-DEP 技術本部 チーフエンジニア 河井博紀)