comments金融の計算において、計算精度は超重要である。精度が低ければ価格付けに失敗し大損するかもしれない。y)、のように四則演算で丸めの方向を指定可能な関数が用意されている。数学関数の誤差についての情報も与えられておりGPGPUで精度保証計算を行うことが可能である。前回同様、ブラックショールズモデルでのオプションプライシングを例に精度保証付き計算の実験を行った。計測対象のオプション明細は1024万件。パラメータは乱数により発生させる。(デルタ、ガンマはめんどーなので省略した。)計算はすべてdouble型で行う。エクストララージを使用。M2050を1つ使用。CPUは1コアのみ使用。コンパイルは全部CUDAでやっている。(CPUには不利な条件だが、CPUとの計算時間は比較しない。)四則演算については丸めの方向を指定しつつ区間演算で精度保証を行う。数学関数については誤算情報を加味しつつ区間を設定し精度保証を行う。(わりとてきーにやっている。数字の順はGPUで精度保証計算をしたプレミアムの下界、CPUでの計算結果、GPUでの計算結果、GPUで精度保証計算をしたプレミアムの上界となっている。最後の時間は、CPUでの計算時間、GPUへのデータ転送と初期化にかかった時間、GPUで精度保証付き計算をしたときにかかった時間(結果の転送時間込み)、GPUでふつーに計算したときにかかった時間(結果の転送時間込み)。(ms)GPUで精度保証付きの計算を行うために普通の5倍くらいの時間がかかる。単精度で計算すると下記のようになる。(ms)この例についてはCPUについては単精度の方が倍精度より遅い。理由としては最適化(特にSSEなのかFPUなのか)やらコンパイラやらCPUの特性やらメモリやらの話題があるがここでは省略する。単精度の場合も普通の計算とくらべて5倍くらいの時間がかかっている。計算量もそうだが分岐命令が追加されたペナルティが大きいものと思われる。単精度の方は精度保証有り無しの時間の比率が変わるかを調べる事が主目的であるため、四則演算以外の関数に関わる精度保証を非常に荒く行っている。上界、下界の差が広いのはそのためである。以上の結果から、ブラックショールズモデルでのオプションプライシングで精度保証付き計算を行うためには通常の5倍程度の計算時間が必要であることがわかる。最初に計算精度が超重要とか書いたけれども、そもそもブラックショールズモデルではボラティリティスマイルや金利なんかの期間構造を無視してしまっているので、そのモデルに起因する差異のほうが数値計算上の誤差より大きい。現実問題での上界下界を求めたければ正のバイアスがかかる式と負のバイアスがかかる式で挟み撃ちーという感じでやる必要がある。(アメリカンオプションのプライシングで見かける。いえ、そこまでやっても実際問題モデル誤差は残る。)それはおいといて計算時間が5倍というのはそんなもんかなという印象。上界、下界のために最低2倍の計算とメモリが必要で、かつ、割り算の場合は正負の場合分けが必要なため分岐が入ってしまう。精度保証付き数値計算は面白い考え方だと思うが、イマイチ流行っていない気がしなくも無い。コンパイラオプションなりVMの設定なりで気軽に使える時代が来たら利用する機会はありそうだが。comments先日(といってもかなり昔)にセットアップしたAmazonEC2のGPUインスタンスでFermiの実験してみた。)比較条件は以下の通り。お題は金融の世界でよく使われるブラックショールズモデルでのオプションプライシング。計測対象のオプション明細は512万件。パラメータは乱数により発生させる。プレミアム、デルタ、ガンマを算出。計測はすべてdouble型。標準正規分布の累積分布関数についてもdouble型の精度のある近似式を用いる。エクストララージを使用。M2050を1つ使用。CPUは33.5ECUをフルで使用。(全力ならGPUは2つ使える。今回はGPU間の分散はやっていない。3.2、CPUの方はGCC(4.1)+openMP。CPUから見える場所に明細がある状態から計算完了(CPUから見える場所への転送完了)だとGPUが2000msecに対して、CPUは300msecくらい。(1コアのみCPUを使うと3300msecくらい)GPU側に明細を転送した後からだとGPUは350msecくらいで計算を終え、計算結果をCPUから見える場所に転送できる。ブラックショールズは計算負荷がかなり軽く、メモリ転送やデバイスの初期化に時間がかかるGPUには不利な条件。~計算結果をCPU側にコピー完了」で230msecなので、GPUはまだ本気が出せていないよーな感じ(それを言うと、CPUも拡張命令使ってないので本気は出せていない)。8コア(2つのクアッドコアNehalem)に相当する計算能力が出せるっぽい。0.000000000001220程度。GAMMA:69438くらい。個別でみるとほぼdoubleの限界のくらいまであっている。誤差部分はGPUの積和演算利用とか、CPUは実は微妙に拡張倍精度演算をすることがあるとか(最適化やSSEなど細かい話題次第ですが)、非正規化数の存在とかあるんだけど、どこが影響しているのかは調べていない。し試してみていたときよりもdouble型の能力・性能がかなり上がっている印象。向いていない処理にもかかわらずまずまずの結果だった。comment開発環境を構築してみた。入れたのはRedmineとSubversion(とBazzar)。