(発表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 めもり

  • 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 あまり使ってないので、要出典)