GeForce GTX 680を触ってみる

出典: トータル・ディスクロージャ・サイト(事実をありのままに)

この記事は、GeForce GTX 680を触ってみる - 正統納豆天国ブログ - Yahoo!ブログGeForce GTX 680: RandomAccessベンチマーク改良版 - 正統納豆天国ブログ - Yahoo!ブログGeForce GTX 680: 姫野ベンチマーク - 正統納豆天国ブログ - Yahoo!ブログおよびGeForce GTX 680: マンデルブロ集合 - 正統納豆天国ブログ - Yahoo!ブログの許可を取って、転載した記事です。

NVIDIAの最新アーキテクチャ「Kepler」を採用したGPU製品、GeForce GTX 680。今回このGPUを入手できたので、軽く性能評価をしてみる。

参考までに、弊社環境でFermi世代のGPUについて同様のベンチマークを取った結果を、併記しておく。

目次

テスト環境

今回のテスト環境は、以下の通りである。

CPU Phenom II X6 1090T (3.2 GHz, 6 cores)
GPU ZOTAC GeForce GTX 680 ZT-60101-10P
Memory Transcend TS512MLK72V3N (4 GB, DDR3-1333) × 4
Motherboard ASUS M4A89GTD PRO/USB3
OS CentOS 6.3(マンデルブロ) / CentOS 6.2(それ以外)
Compiler CUDA 4.2 (-O4 -arch=sm_30)

GeForce GTX 680の売り物の一つであるPCI Express 3.0に対応していない、旧世代の環境であるが、データ転送を無視した性能を測るには、誤差程度の差しか出さないであろう。

比較対象のFermi世代のテスト環境は、以下の通りである。

CPU Xeon W3565 (3.2 GHz, 4 cores)
GPU GeForce GTX 580
OS CentOS 5.8
Compiler CUDA 4.2 (-O4 -arch=sm_20)

CUBLAS

まずは、手っ取り早くCUBLASの行列積の性能を測ってみることにした。GitHubに、ベンチマークテスト用のソースコード(cublas_benchmark)を置いたが、*GEMMの計算のデータサイズ、M、N、Kの値を固定して、データを格納している行列の大きさ、LDA、LDB、LDCの値を変えながら、CUBLASの性能を測定する、というやり方である。

M、N、Kは5000で固定、LDA、LDB、LDCは、それぞれ5000~5008の間を1刻みで動かして、最高の性能が出ているポイントを抽出する。

測定結果

Kepler Fermi
LDA LDB LDC 実行時間(msec) 性能(GFLOPS) LDA LDB LDC 実行時間(msec) 性能(GFLOPS)
単精度実数(cublasSgemm) 5008 5008 5008 283.630310 881.429069 5000 5001 5008 244.723358 1021.561660
倍精度実数(cublasDgemm) 5008 5008 5005 2246.367676 111.290775 5005 5005 5003 1282.586914 194.918564
単精度複素数(cublasCgemm) 5008 5008 5004 692.504333 1444.034285 5008 5000 5008 784.403137 1274.854667
倍精度複素数(cublasZgemm) 5008 5003 5002 8479.883789 117.926144 5007 5004 5004 5088.061035 196.538523

単精度に関しては、複素数の性能が実数に比べてかなり良い。Fermi世代のGPUの実効性能を上回る値であるが、GeForce GTX 680の単精度ピーク性能は3090 GFLOPSであるので、メモリ帯域の影響を受けにくい*GEMMでさえ、メモリ帯域がボトルネックになっている可能性を考えさせられるものとなっている。一方、倍精度に関しては性能は安定していて、ピーク性能128.8 GFLOPSにかなり近い性能が出ている。もっとも、この倍精度はFermi GeForce以上に性能が抑えられているため、倍精度の行列計算をしたいのであれば、素直にFermi世代のGPUを使うべきだろう。

RandomAccess

今度はHPC ChallengeRandomAccessベンチマークの性能を測定してみた。測定に使ったプログラムは、前回と同じくGitHubに、cuda_randomaccessリポジトリとして置いてある、CUDA移植版を使った。データアクセスに関して、Compare-and-Swapによる64ビットアクセスのatomicCASを使ったものと、それよりもアクセスが軽いが、32ビットしか用意されていない、atomicXORを使ったものとの、2種類で比べてみた。

測定結果

ファイル:kepler_randomaccess.png

log(N) 秒 (680, CAS) 秒 (680, XOR) 秒 (580, CAS) 秒 (580, XOR) GUP/s (680, CAS) GUP/s (680, XOR) GUP/s (580, CAS) GUP/s (580, XOR)
0 0.000026 0.000025 0.000035 0.000034 0.000153 0.000160 0.000114 0.000117
1 0.000032 0.000031 0.000044 0.000040 0.000253 0.000259 0.000181 0.000199
2 0.000038 0.000036 0.000055 0.000054 0.000418 0.000440 0.000291 0.000299
3 0.000045 0.000043 0.000066 0.000065 0.000704 0.000736 0.000482 0.000494
4 0.000053 0.000051 0.000078 0.000077 0.001201 0.001255 0.000819 0.000836
5 0.000061 0.000058 0.000091 0.000085 0.002101 0.002198 0.001413 0.001500
6 0.000079 0.000066 0.000117 0.000097 0.003256 0.003882 0.002195 0.002644
7 0.000127 0.000074 0.000212 0.000109 0.004017 0.006966 0.002410 0.004710
8 0.000202 0.000081 0.000460 0.000124 0.005062 0.012579 0.002225 0.008250
9 0.000367 0.000089 0.000846 0.000133 0.005581 0.022989 0.002421 0.015425
10 0.000636 0.000097 0.001671 0.000145 0.006442 0.042202 0.002451 0.028256
11 0.001405 0.000106 0.004644 0.000161 0.005831 0.077132 0.001764 0.050945
12 0.003609 0.000116 0.008908 0.000174 0.004540 0.140698 0.001839 0.094256
13 0.003525 0.000130 0.011360 0.000209 0.009296 0.251227 0.002884 0.156647
14 0.002636 0.000152 0.009598 0.000340 0.024857 0.430252 0.006828 0.192844
15 0.002503 0.000188 0.009223 0.000557 0.052370 0.697192 0.014211 0.235470
16 0.002247 0.000259 0.006719 0.000826 0.116679 1.011858 0.039017 0.317237
17 0.002904 0.000851 0.009242 0.001380 0.180538 0.616357 0.056727 0.379936
18 0.003482 0.002608 0.008122 0.002337 0.301113 0.402012 0.129099 0.448668
19 0.004480 0.006265 0.007394 0.004400 0.468144 0.334753 0.283632 0.476657
20 0.010452 0.013809 0.009440 0.008668 0.401307 0.303746 0.444334 0.483902
21 0.022702 0.029001 0.013407 0.017507 0.369514 0.289250 0.625676 0.479170
22 0.045438 0.059603 0.027157 0.035584 0.369237 0.281484 0.617792 0.471482
23 0.090056 0.120367 0.054709 0.071716 0.372596 0.278768 0.613329 0.467876
24 0.180234 0.241702 0.108893 0.144393 0.372344 0.277651 0.616281 0.464765
25 0.359900 0.483043 0.219609 0.289531 0.372931 0.277859 0.611166 0.463569
26 0.719608 0.963359 0.522065 0.581979 0.373030 0.278645 0.514180 0.461246
27 1.438592 1.922496 1.216787 1.216389 0.373192 0.279257 0.441220 0.441365

Keplerの圧倒的なピーク性能を生かせる、キャッシュないしTLBに収まる範囲のデータサイズでは、GeForce GTX 680の性能が飛び抜けている。ただし、データサイズがこの範囲をオーバーしてしまうと、atomicXOR、atomicCAS共に、性能が大きく落ち込むのが分かる。KeplerのCUDA Coreが多すぎて、メモリコントローラがうまく働いていない可能性が考えられる。

姫野ベンチマーク

GeForce GTX 680のベンチマーク第3弾、姫野ベンチマークである。CUDAによる姫野ベンチマークの実装に関する論文は、CUDAによる定常反復Poissonベンチマークの高速化(並列化と高速化)が有名であるが、この論文を基に、最近のGPUでも性能が出るように再実装を行ったものが、今回のプログラムである。

配列サイズはMIDDLEのときが最適な数値が出たので、この結果を載せる。

測定結果

Kepler

This benchmark uses GPU #0.
mimax = 129 mjmax = 129 mkmax = 257
imax = 128 jmax = 128 kmax =256
 Start rehearsal measurement process.
 Measure the performance in 3 times.

 MFLOPS: 47245.050310 time(s): 0.008706 5.348081e-04

 Now, start the actual measurement process.
 The loop will be excuted in 20675 times
 This will take about one minute.
 Wait for a while

 Loop executed for 20675 times
 Gosa : 1.525615e-07
 MFLOPS measured : 71012.474462 cpu : 39.917616
 Score based on Pentium III 600MHz : 866.005786

Fermi

This benchmark uses GPU #0.
mimax = 129 mjmax = 129 mkmax = 257
imax = 128 jmax = 128 kmax =256
 Start rehearsal measurement process.
 Measure the performance in 3 times.

 MFLOPS: 48699.432631 time(s): 0.008446 5.348081e-04

 Now, start the actual measurement process.
 The loop will be excuted in 21311 times
 This will take about one minute.
 Wait for a while

 Loop executed for 21311 times
 Gosa : 1.210273e-07
 MFLOPS measured : 79464.049121 cpu : 36.769427
 Score based on Pentium III 600MHz : 969.073770

Fermi世代では79 GFLOPS出ていたのが、Keplerでは71 GFLOPSしか出ていない。ドライバが未成熟なのも考えると、今後の改良に期待される。

マンデルブロ集合

これまでいくつかベンチマークを採ってみて、GeForce GTX 680のベンチマーク結果が微妙なのは、メモリ周りの性能が微妙だから、という仮説を立ててみた。この仮説を検証するために、メモリ性能の影響を受けにくい、マンデルブロ集合の描画を、ベンチマークとして扱ってみることにした。座標から初期値が求まる漸化式が収束するかをひたすら計算し、最後にメモリに反復回数を書き込むだけであるので、メモリアクセスは計算量に比べてかなり小さくなる。今回は、255回反復して、発散した反復回数をグレイスケールの画像として出力している。

ただし、CUDA SDKに付属のサンプルの場合、倍精度対応のGPUだと、倍精度で計算してしまうようで、今回の目的では参考になりにくい。そこで、自作のプログラムを書いて、測定してみることにした。

測定結果

ファイル:kepler_mandelbrot.png

Kepler

Height: 1024, Width: 1024
0.567040 milliseconds
1849209.875000 kilopixels/second

Fermi

Height: 1024, Width: 1024
0.899680 milliseconds
1165498.875000 kilopixels/second

Fermiに対してKeplerは、1.5倍以上の性能向上を見せている。今回のベンチマークは、メモリ性能がボトルネックという仮説を支持するものとなっている。

元のプログラムの収束判定にミスが有ったので修正。ベンチマークの傾向は変わらず。


この記事へのコメントをお寄せください

  • サイトへの書き込みに差し支えございましたら トータルディスクロージャーサイトサポート係へメールをお送りください
  • トータル・ディスクロージャ・サイトに投稿された文章と画像は、すべてその著作権がHPCシステムズ株式会社に帰属し、HPCシステムズ株式会社が著作権を所有することに同意してください。
  • あなたの文章が他人によって自由に編集、配布されることを望まない場合は、投稿を控えてください。
  • コメントを書き込む場合は名前にひらがなを織り交ぜてください。
  • あなたの投稿する文章と画像はあなた自身によって書かれたものであるか、パブリック・ドメインかそれに類する自由なリソースからの複製であることを約束してください。あなたが著作権を保持していない作品を許諾なしに投稿してはいけません!

<comments hideform="false" />


Comments

ノート:GeForce GTX 680を触ってみる

個人用ツール