Twitter

最近のトラックバック

無料ブログはココログ

« 2011年9月 | トップページ | 2011年12月 »

2011年10月

2011年10月11日 (火)

CUDAデバッグ

卒業研究でCUDAを使っています。

自分で書いたデバイスコードがまともなのか心配なので、CPUで同じ動作をするコードを書いて比較するのですが、どうにも微妙、非常に微妙に値がずれます。

計算方法をチェックしても間違ってるとは思えないし・・・

で、いろいろ調べてるとやっと見つけることができました。(マニュアル読んでないだけかも)

CUDAのデバッグをCPUと比較して行う場合、次のことに注意するとある程度うまく行くようです。

1.積和演算器による誤差の変化

2.実数の演算順序

1について、GPUには、頻繁に行われる実数の積和演算( 1.4. * 2.2 + 3.3のような演算 )を行う装置があり、積和演算器を通す場合と、それぞれ乗算器と加算器を使う場合では結果が異なる。

2について、たくさんの加算を実行する場合、コアレッシングやバンクコンフリクトの影響を考えて加算の順番をCPUと異なる順番で実行すると、結果が異なる。

・・・といった感じです。

1については__fmul_rnと__fadd_rnという関数を使えば最適化を防止し、CPUと同じ動作をさせることができます。

2については多分、なのですが、CPUでGPUの動作と同じになるようにプログラムすると、ちゃんと結果が一致したので多分こういうことだと思います。

いずれにしても、CPUと同じ結果に持って行くには、複雑なプログラムだと結構大変だと思います。

無理に同じにしようと努力するより、浮動小数点の仕様からどの程度までのずれが誤差と言えるのか調べたほうがいいかもしれません。

ただ、ロックの位置やメモリ操作のミスで値がずれたりもするのでチェックしたい誘惑にもかられます(笑)

便利なことには違いないですが、気を付けていないとひょんなところから穴にはまりそうで怖いです。

しかしCUDAは速いな・・・

« 2011年9月 | トップページ | 2011年12月 »