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


Reload   Diff   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes
Last-modified: Tue, 10 Jun 2014 01:13:51 JST (3601d)