C
概要 †
- GPGPUのプログラムの書き方
- 最適化されたGPUは、最適化されたCPUの2倍程度の早さ
- CUDAなら100倍!!とか言ってる人を見かけたら、「それCPUのほうも最適化したらどうなるんですか?」と聞いてあげるようにしましょう。
- 本気じゃないなら、「簡単に書けて早い」「コーディング時間少なく早い」という程度に思っているべき
GPUの速度 †
- Core i7は100GFLops
- GeForce? 285は1000GFlops(この性能は1997年のスパコンレベル、なお2009年は131TFlops)
- 8コアCore i7(第四世代2013年6月)は単精768GFlops, GeForce? GTX Titan Z(2014年4月)は単精度8121GFlops
- 例えば粒子計算はいい加減実装でも1000倍早い。
- 1.2はfloatのみ、1.3(GT200以降)からはdoubleが扱える
- CPUとGPUは並列に処理可能(例外はcudaMemcpy)
- cudaMemcpy
- CPU->GPU, GPU->CPU, GPU->GPUのデータコピー
- cudaMemcpyAsync?:非同期転送は現状効率が悪く、デバイスドライバの改良が待たれる
nvcc
- エミュレーション機能がある
- 数千スレッドを立ち上げるのでハングアップしたように感じる。速度は1/1000以下になる。低問題サイズで行うべき
- エミュレーションではprintfが使えるようになる。#ifdef __DEVICE_EMULATION__を活用
- メモリ関係のデバッグは不能
- カーネル関数のエラー検知はほぼ不可能
- CUDA APIはcudaError_tで検知し、cudaGetErrorString?で詳細。cudaGetLastError?で最終エラー検知
- GPUの特徴
- カーネル関数はSPMD、各SMの中の8個のSPはSIMD
- CPUにあってGPUに無いもの:Out-of-Order, 分岐予測, if文
- メモリの種類
- ローカル・グローバルメモリは100倍遅い(それでも159GB/s。CPUは36GB/s)
- レジスタ:変数の数によって増減、32が上限なので無駄な変数は削減せよ
- シェアードメモリ:高速
- 性能評価
- Occupacy 100%は良い事。
- Active Thread Blocks per Multiprocessorが重要
- SMあがり3ブロックがアクティブになると強い
名前 | 価格(円) | GFlops | GT 720 | 5500 | 306 | GT 730 | 6000 | 692.7 | GTX 780 | 64000 | 3976.7 | GTX 780 Ti | 90000 | 5045.7 | GTX TITAN Z | 400000 | 8121.6 | GTX TITAN Black | | 5120.6 | GTX TITAN | | 4499.7 |
名前 | 価格(円) | GFlops | GTX 980 Ti | 85000 | 5632 | GTX 980 | 70000 | 4612 | GTX 970 | 40000 | 3494 | GTX 960 | 24000 | 2308 | GTX 950 | 18500 | 1573 | GTX TITAN X | 130000 | |
|