前回の投稿において、IntelのIntrinsic関数をIBM Powerにポートするにあたっては、テストフレームワークを作ることが必要ということを論じた。
同じieee754を使っていても、浮動小数点演算はアーキテクチャ間でズレがある可能性がある。
精度が必要なコンピューティングに関してはそのためのソフトウェア的な対策も必要となるため、それがパフォーマンスに影響を与える。
浮動小数点演算のアーキテクチャ間のズレを検出する方法として、このテストフレームワークを使えるだろう。
今回は、テストフレームワークにおいて、Intrinsic関数にどのような値を入力する必要があるかについて論じる。
extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__,__artificial__))
_mm_add_pd (__m128d __A, __m128d __B)
{
return (__m128d) ((__v2df)__A + (__v2df)__B);
}
上の関数において、__A
と__B
において、テストするための値を入力する必要がある。
Perfunctory Testにおいては
standards compliance tests
accuracy tests
regression tests
などがある
standards compliance testsでは±Inf,NaN,±0などの値を入力してテストすることとなる。特別な扱いを必要とする値を入力してテストすることとなる。IntelとIBM Powerにおいて挙動や結果が同じであることを確認するものとなる。
accuracy testsでは、IntelとIBM Powerにおいて誤差が許容範囲にあることを確かめることとなる。
regression testにおいては、前回のリリースでバグを起こした値を入力することとなる。
Randomized Testにおいては、継続的にランダムな値を入力し、結果を比較して正確性を確かめることとなる。
Bit-Identity Testにおいては、浮動小数点値に置いて、ランダムにビットを配置し、それらをIntelとIBM Powerに入力して、挙動や結果が同じであることを確認するものとなる。浮動小数点としては不正な値が入力される可能性もあるが、その場合も挙動や結果が同じであることをチェックすることとなる。
あと、過去にバグが見つかった値のデータを保存しておいて、統計を取り、次回の探索から過去にバグが多く見つかった値を優先的に探索する戦略も取ることができるかもしれない。
参考文献
間違いや意見などがあればコメントでお願いします。