CUDAのDocumentsをさらっと読んだメモ
英語だからと読むのを避けていたが、別に難解な英語で書いてあるわけでもない。ちょっと目を通してみて、知らなかったことメモ。
__noninline__ and __forceinline__
__device__関数は通常だとカーネル関数内でインライン展開されるそうだが、それを指定したい場合にと。例えば再帰呼び出しするときとか?その場合に付ける必要があるのかは良く分からないけど。
#pragma unroll
forループをunrollしてくれるらしい。しらんかった。
#pragma unroll 5
で5回unrollしてくれると。
__restrict__
ポインタの指す先を毎回読まないで、一回だけ読むようにしてコストを減らすようにコンパイラに知らせてるのかな?
Dynamic Global Memory Allocation
sm_20以降だとカーネル関数内でVRAMを確保できる。知らなかった…これが出来ないから、MD-LJのプログラムは書くの難しいよなあって思ってたけれど、これさえあれば希望が…。あれ、でもこの機能って頑張れば手で実装できるのかな?
Constant Memory
コンスタントメモリの存在を忘れてて、いままで使わずにコードを書いてたのでちょっと触ってみた。ホストからコンスタントメモリへのコピー、グローバルメモリからコンスタントメモリへのコピー、両方できるのね。でもコンスタントメモリ使うように書き換えたら逆に遅くなった(ほんのちょっとだけだけど)のでやっぱりもとに戻した。
__attribute__ ((aligned(8)))
これはGCCの規約? 構造体のメモリ構造でpaddingを避けたい時とかに使う。