GPUを支える技術読み始めた 第5章[後半] 最近、仕事の忙しさにかまけて全然ブログを更新できていなかったが、なんとかGPUを支える技術の5章までを投稿することができた。 時間がないわけではないのだけどだけど、普通の読書や実装などに時間を割くと、なかなか文章を書く暇がない。。 _| ̄|○ 効率を重視しながらも、重要なところを上手くまとめて復習に役立てられるブログにしていきたい。 第5章 GPUプログラミングの基本[前半] 5.4 GPU プログラムの最適化 GPUで最大限力を発揮するには、その資源を有効に使うプログラム作成する必要がある。 具体的には以下のような点が重要である。 スレッドブロックはSMの数の整数倍にする NVIDIAのGPUはスレッドブロック単位で各SMに割り当てられ計算される。1度の割当で計算しきれない分は2巡目以降にで割り当てられる。この場合、スレッドブロックの数が中途半端だと最後のターンでSMにあまりが出てしまう。ただし、複数カーネルを同時に実行する機能もあるので、他のカーネルがあれば空いたスペースは自動で埋められる。 演算機の計算パイプラインを意識する 演算器が前の計算を行ってからその結果を再度利用するには10サイクルほど要する。NVIDIA GPUはワープ(32スレッド)を同時に計算を行うが、ワープの結果を利用する予定の他のワープはその実行時間分を待つ必要がある。この隙間時間はワープスケジューラが別のワープを演算機に割り当てるが、全部で64ワープしかない、SM1つあたりのレジスタファイルは65,536個(1スレッドあたり32個)しかないということを考慮してプログラムを作成する必要がある。なお、ワープがDDRアクセスを必要とする場合、400〜800サイクルかかることもある。 条件分岐への配慮 以前の章でも説明したとおり、プレディケートによる条件分岐はif, elseの両方