読書活動 PPMP Ch.8

CHAPTER 8 Stencil

  • Stencil は偏微分を計算するのに使います。Convolution に似てますが、問題の性質から最適化の仕方も変わります。
  • 問題柄三次元で計算がちですが、三次元のタイルはあまりでかくできませせん。したがって halo の割合が大きく DRAM アクセス帯域の効率を下げがちです。
  • そこで thread coarsening をします!つまりループを回して cube の一つの次元を iterate していく。Tile をシフトする必要があるが、再利用する cell は shared memory 間でのコピーなのでレイテンシの問題がない。
  • これは面白いところだよな。CPU だと ring buffer 的にインデクス側で rotate しそうなものだけれど(というか GPU でも同じことはできるけど、説明を簡略化するためにそういうロジックは省いているのかもしれない。)
  • アクセスパターンによっては shared memory を使うまでもなく、ループをまたいでレジスタ(ローカル変数)を使いまわせる。これを register coarsening という。

この本は地の文で「X 行目から Y 行目では ZZ をしています」とコードを解説するんだけど、あまりにフォローするのが難しいので文を読むのは諦めてコードをにらんで済ますことが多い。Literate programming スタイルで書いてくれればよいのになあ。

読書活動 PMPP Ch.7

CHAPTER 7 Convolution

さて具体的なテクニックの章に入ってまいりました。Convolution とか簡単でしょと思っていたが、ここまでの章を読むといくらでも複雑な高速化があり得ることがわかり、やや恐怖。

  • Tile 化するが、Convolution という計算の性質上 input のタイルを output のタイルより大きくしないといけない。
  • Input のタイルを output のタイルと同じ大きさに揃え、はみ出す分は L2 が hit することを期待するアプローチもある。って L2 あんのね。
  • どのアプローチが一番速い、という話はしない。ベンチマークしろということか・・・。