倍精度浮動小数点数演算

GTX295など、GTX200シリーズではGPUカーネル上で倍精度の演算を行うことが出来ます。単精度による丸め誤差の影響が少なくなる分、計算速度がある程度遅くなるとのことなので試してみました。
以前CUDAのサンプルプログラムを参考(というかほぼ丸写し)にして作った行列乗算を並列に行うプログラムを、単精度から倍精度に機械的に変更してみました。CPUとGPU間のデータ転送速度も含めた実行時間は以下の用になりました。*1

行列のサイズ 単精度演算 倍精度演算
512 2.2 ms 6.0 ms
1024 13.5 ms 40.5 ms
2048 98 ms 304 ms

もっと行列のサイズを大きくしてみないと何とも言えないですが、この結果からすると倍精度演算は単精度演算に比べ3倍程度計算に時間がかかるみたいです。CUDAの倍精度演算って、ハード的に実装されてるんじゃないのかな?3倍は微妙なラインですねぇ。うまく単精度と倍精度を併用して、誤差と速度の妥協点を見つけろということなんでしょうか。

倍精度演算を含むプログラムのコンパイル

float を double に置き換え、コンパイルして実行してみると、帰ってくる値が全て0になってしまいました。そんなバカな、と思って色々調べたのですが、どうやら倍精度演算を行うにはコンパイルオプション"-arch=sm_13"を指定しなければならないようです。

% nvcc hoge.cu -lcutil -arch=sm_13

これで倍精度演算を含むCUDAプログラムのコンパイルが出来ます。

*1:適当な計測なので信頼度は低いですが…