CUDA
重力を計算するところ、 float dx = diff_x(sx[i], x); float dy = diff_x(sy[i], y); float dist_square = dx * dx + dy * dy; float d = dist_square * sqrt(dist_square); ax += dx / d; ay += dy / d;ここで、sqrtを使っているが、実は、 sqrt(x) = x / …
前回遅かったのは、グローバルな配列に何度もアクセスしていたためと思われる。共有メモリというものがあって、こちらは速いので、これを使うことを考える。 説明しやすくするために、4096個の質点に0〜4095のIDを振っておこう。共有メモリは、ブロックの中…
ネタがないので、浮動小数点数の問題をみてみる。 n個の質点が互いに重力による相互作用を及ぼしあう問題を考える。なるべく多くの質点を用いたいが、ここでは4096個の質点の計算をする。また、これらはトーラス面上にあるとする。1×1の正方形を用意し、上下…
前にも取り上げたが、コラッツの問題というのは、どの自然数も、奇数なら3倍して1を足す、偶数なら2で割る、という操作を繰り返すといつか1になるか、というものである。例えば、 7→22→11→34→17→52→26→13→40→20→10→5→16→8→4→2→1 となる。 数値実験では、今の…
ガウスの故事にならって、1000個ずつ区切って素数の個数を数える。1001〜2000に135個、2001〜3000に127個ある。nを1500、2500、…として、横軸を1/log n、縦軸を素数の個数としてプロットした。 素数の密度は、ほぼ1/log nになっていることがわかる。これを素…
GPUというとふつうはfloatの計算だが、あまり興味はない。やっぱり整数の計算をしたい。整数の計算速度はどんなもんだろう。適当に加乗除のコードで試してみた。 __global__ void int_add(int *data, int width, int height, int nRep) { unsigned int xInde…
コードは書けるようになったものの、あまりよくわかっていない。しかし、いちおう解説をしておこう。GPUは、元々画像処理をするものなので、画像をGPUに送る。データは1次元だが、 const unsigned int size_x = 1024; const unsigned int size_y = 1024;とい…
まず、このへんから開発ツールを落としてくる。http://www.nvidia.co.jp/object/cuda_get_jp.htmlそれから、libとincludeにパスを通す。 サンプルを参考にして、前にやった数値積分の問題をCUDAで計算する。http://d.hatena.ne.jp/inamori/20080312/p1フルソ…
GPUを使うと計算速度が桁違いに上がることがあることは前にも紹介した。 しかし、GPUを動かすためのシェーダプログラミングはやや独特で、それ以上にGPUを動かすための準備に膨大なコードが必要で、かつ見通しも悪い。そこでCUDAである。 http://www.nvidia.…