倍精度浮動小数点数演算
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:適当な計測なので信頼度は低いですが…