読書活動: PMPP Ch. 6

昨日は休カフェイン日だったので良く寝られた。すなわち若干寝坊。

CHAPTER 6 Performance considerations

  • Memory Coalescing: DRAM の burst access を生かせるよう隣接スレッドが隣接アドレスのメモリに同時アクセスする (ex. row major matrix の同一 row を一緒に読む)
  • Interleaved data distribution: DRAM アクセスは channel が全部使われるようにしつつ、各 channel が異なる bank を順番にアクセスできるようにする。
  • DRAM アクセスがいい感じに散らばっていないといけないとか、キャッシュがある CPU のメモリアクセスのルールと全然違うよなあ。GPU のキャッシュアクセスに相当する shared memory はプログラマが明示的にロードするから、その(locality が高く速いメモリへの) ロードの仕方は spread していないといけない、ということなわけだが・・・。
  • 帯域の(並列の)広さぴったりにしつつ、かつ帯域のシーケンシャルなスループットを最大化する、というのが interleaved data distribution なわけだが、そんなの aware なコードを書くとか不可能だっつーの。まあ CPU でも同じ水準の awareness を持ってコード書いてるわけじゃないから似たようなもんか・・・。
  • この問題は CPU にはないのかというと、まあ、ないね。理論上個々のコアからの並列アクセスは interleaved な方がいいわけだけど、そんなに足並み揃えられないからねえ。GPU もこういう芸当ができるのは SM 単位、という理解でいいのだろうか。
  • そして GPU にもキャッシュはあるらしい。が、これは十分にタイミングの近いアクセスが coalesce されるようにする目的という。
  • Thread coarsening: 本来なら並列化する処理を直列化して同じカーネルの実行に押し込めることで、カーネル単位のオーバーヘッドを減らす。たとえば shared memory へのデータのロードとか。Thread に分割しても下のハードウェアの並列度が低くて実際には parallel にならない場合に有効。
  • Shared memory をカーネルの実行を跨いで渡すことができないのでこういうのが必要になる。勝手に色々やってくれる CPU cache のありがたさが身に染みるわ。
  • Check list が載っており、個々の項目を復習しつつ「この章で使うよー」と紹介。今更だが、GPU のプログラミングって何かを速くするのが全てだから、全ての章が高速化の話なのだね。なかなか認知負荷の高い本である。
  • プロファイラの使い方も教えてほしいけど、「リファレンスみてね」でおしまい。