(発表6回) NVIDIA GPU のメモリモデルと仲良くなる。 @fjnli
Fortran から cuda に落とすツールがある?
どれ? CUDA, OpenCL, DirectCompute,GLSL
--
- NVIDIA CPU のみ対象
CUDA 対象。
Motivation
CUDAはプログラマが明治的にメモリを操作する必要がある。
約束事が多い。CPU の様に組むと遅くなる。
- Fermi アーキテクチャ。汎用計算フレンドリ。2009年末に導入
- Kepler 2012/05 GeForce GTX680 これから主力
更に汎用計算重視。ベンチマーク取ったけど、あまり速くなかった。
CudaToolkit5 からが本番?
------
Geforce と Tesla
- 単精度でよく歩留まり気にしなければ Geforce 。安いし速い事が多い。
- ECC 12.5%のloss
-----
Global Memory
- いわゆる VRAM
- ホストから読み書き出来るこはここだけ
- L1cache
coalesce の衰退。
- とはいえいたずらにアクセスすると global との帯域使い過ぎて性能落ちる。
- アラインメントが取れない場合に、以前は shared メモリにもってきて処理してた。
- CUDA C Programming Guide 5.0
- レジスタ
ーコンパイラが割り当てる。意識しなくても動く。
- すべての計算命令はレジスタ間で行われる。(ロードストア以外は)
volatile でレジスタへの cache はさけられるけど、最適化も消えるので嫌。
シェアドメモリは全スレッドから使える(レジスタはスレッドローカル)
スレッド間のデータ交換に使える。(配列の総和を求めるとか)
ソフトウェアキャッシュ(勝手に追い出されない、ヒット率100%)
*Shared めもり [#g02cca22]
- Bank Conflict (性能の低下)
- 条件は緩和される方向に。頻繁にかわる。
- Fermi => Kepler で緩和. GT200 => Fermi も。
- Occupancy スレッド割当率
- Fermi では 1024 使いたいけど性能落ちた。SM 毎のスレッドが少ないので。
Kepler ではSM毎のスレッドが2000位なので、Occupancy 落ちない。
nvcc -ptxas-options=v でレジスタの使用量が分かる。
Occypancy 計算面倒 > Compute Profiler 使いましょう。
低い Occypancy でも十分な性能が出る場合も多い。
Constant Memory
- カーネル引数は Constant Memory 渡し。
- Fermi以前は1 Shared Memory 渡しだった。
地味に改善されてる。
1-----
- Texture Memory
- Texture Unit の提供する機能を使える
GPGPU 的には独自のキャッシュがある。L1 と別に欲しい時に性能が上げられる。事がある。
clock() 取ると、ストールで数10clock 消費されて重たい
clock を shift してる。(read => write でストールする)
Kepler では解決されてる、
Fermi 時代はホットクロックで、CUDA Core は周りの2倍で動いてた。
ので、シフトしてたのでは。
Kepler ではやめたので。このシフトが無い。
性能測定時のノイズが減るかも。(Kepler あまり使ってないので、要出典)