前回の記事で設計したToukaテストフレームワークを実際に作っていきたい。
まずは、ランダムな__m128を生成するモジュールを定義する。通常のシミュレーションのように「高速にそれっぽい分布を作る」のではなく、「コンパイラ最適化やハードウェアの挙動の違い(バグ)を炙り出す」ための戦略が必要である。イントリンジックの移植において、最もバグが混入しやすいのは「通常の範囲(0.0〜1.0など)」ではなく、ハードウェアの解釈が分かれやすい特殊値や境界値である。一様分布だけでは、これらのケースをテストできる確率が極めて低くなる。
非正規化数(Denormal number または Subnormal number)とは、IEEE 754 浮動小数点数規格において、「ゼロに極めて近い、極小のプラス/マイナスの実数」を表現するための特殊な状態のことである。非正規化数は、ポート作業においてバグの温床となる。
アーキテクチャが異なっても(Intel、PowerPC、ARM)、完全に同じビットパターンの浮動小数点数系列が生成されることなどが絶対条件である。よって、ビットパターンをファイルとして保存することになるし、比較するときもビットパターンとなる。
整数と浮動小数点数では乱数の生成戦略が異なってくる。
ランダム値生成戦略を入れ替えられるようする。複数の戦略を準備する。例えば、ある範囲のランダム値を生成するものや、エッヂケースを入れるもの、ビットパターンの01からランダムにしたもの。あるいはそれらの混合。
ランダム値がある一定の割合でエッヂケースを入れ、ある一定の割合で一様分布の値を入れるようにする。
(続き書きます)