GPUを支える技術を読んだのでメモ。会社のお金で買ってもらいました。ありがとうございます。
技術評論社
売り上げランキング: 505
1章 [入門]プロセッサとGPU
- SMが独立の命令列を実行できる単位
- CPUがアクセスするメモリとGPUがアクセスするメモリは別になっているのが現状は一般的
- GPUメモリは高バンド幅メモリが必要。CPUメモリはバンド幅はそこまで必要ないが大容量であって欲しい
- 特質が違って統一させるともったいない
- Skylakeぐらいになってくると、同じぐらいのメモリでも有効に使える、とかなんとか
- グラフィックスでは1ピクセルちょっと違っても気にならないので、エラー検知をしない
- GPGPU向け Fermi では特別に誤り訂正ユニットを載せた
- SIMDとSIMT
- SIMD: 複数データにたいして1つのインストラクションを1度に実行する。全体で1つのインストラクション。命令ユニットが少なくてすむ。
- SIMT: NVIDIA独自(というか提案?)のアーキテクチャ。SIMDの改善。32本のスレッド(1 Warp)に対して1つのインストラクションを1度に実行する。全体としては同時に複数のインストラクションを発行可能(別Streamを指定して発行)。SIMT アーキテクチャでないと実現不可能なのかがいまいちわからないが、Predicate という機構が入っていて、条件分岐処理を書くことができるようになっている。ただし、MIMDのように if の TRUE 側も FALSE 側も並列実行できるわけではなくて、どちらか一方の path のみが同時実行になる。
- ref. このサイトが詳しかった http://yosefk.com/blog/simd-simt-smt-parallelism-in-nvidia-gpus.html
4章 [詳説] GPUの超並列処理
- kepler 以降で、gpu カーネルから gpu カーネルを起動するダイナミックパラレリズムという機能が入っている
- float16を使うと32に比べて2倍になると思いきや、メモリバンド幅のほうがネックになっていて、4倍ぐらいになる。とにかくバンド幅の進化が、GPUの進化においついていない
5章 GPUプログラミングの基本
PTX アセンブラっぽいやつ
- nvidia は機械語を公開していない。互換性をばんばん壊してる
- が、ドライバでPTXを機械語に実行時に変換していて、PTXレイヤで互換性を保っている
同期
- __syncthreads(): 同一ブロック内の全スレッド待ち合わせ
- __threadfence_block(): メモリアクセス(グローバルメモリとシェアードメモリ)全てが デバイス内(シェアードメモリの場合はブロック内)の全てのスレッドで確認できるようになるまで待機
- 同一ブロックじゃなくてもいいのかな? => そんなかんじっぽい Shared Memory and Synchronizations
- cudaStreamSynchronize(): 指定したストリームの処理完了を待つ
- cudaDeviceSynchronize(): 指定したデバイスの処理完了を待つ(全ストリームの処理完了を待つ)
一つのワープに含まれる32のアクセスのアドレスが128バイト境界にアラインされた128バイトの範囲内(補足: 128の倍数でメモリ領域が分割されている)にまとまっていれば1回のメモリアクセスでまとめて処理(コアレス)できる。
- 1回で処理できず、もう一度アクセスしにいくことをリプレイという
- リプレイを避けることが高速化の鍵
シェアドメモリは on chip なので、グローバルメモリより速い
- 列方向で飛び飛びアクセスになる場合は、シェアドメモリに転送しておくと改善できるかも(転送するには一回アクセスはするんだよな?何度もアクセスする場合は一回ですむ、ということかな)
- シェアドメモリも同じバンクからアクセスすると遅くなるので、ズラしたほうが良いらしい。そこまでしなくても十分速いけど
ダブルバッファ
- ストリームを使って、非同期にメモリー転送すると、転送中に計算させられるから良い。
- 計算中のメモリ領域は上書きできないので、半分しか使えない。ダブルバッファというテクニック
DMA転送する場合に、スワップアウトが起きると困る。起きないようにするのが、pinned memory
感想
- 単著の割に、内容が重複していることが多いと感じた。
- 例えば、SIMDとSIMTの話は、何度も出てくる。
- 内容は網羅的だが、詳細までは説明されていないと感じた。
- 重要なキーワードは漏れなく載っている。
- しかし、わかりにくいものは、わかりにくいままで、結局ウェブ検索した。
- 例えば、SIMT がわかりにくかった。