テストフレームワークToukaを作る上で、Intrinsic演算が例外を発出した場合、それをテストフレームワークの出力に記録する戦略が必要となる。それについて記述していこう。
Intrinsic演算とは、IntelのIntrinsicとそれをOpenPOWERやRISC-Vへポートしたものに値を投げて主にSIMD演算を行うものである。その中核となる場所をIntrinsic演算部という。
Intrinsic演算部には、Intel側にはIntel Intrinsicが実行されるように記述されており、OpenPOWER側には以下のようなラッパー構造が記述されている。
extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__,__artificial__))
_mm_add_pd (__m128d __A, __m128d __B)
{
return (__m128d) ((__v2df)__A + (__v2df)__B);
}
C言語にはtry catchに相当する構文は存在しない。テストフレームワークをIntrinsic演算部とモノリシックに作ると、例外を発出した場所でアプリケーションが止まってしまう。
Intrinsic演算はOpenPOWERにポートしたラッパー構造において、ポインタ参照キャストなどのリスクある演算も行うため、未定義の動作なども検出できると望ましい。
ソフトウェアとして、Intrinsic演算部とテストフレームワークToukaの他の部分を分離する手がある。
Intrinsic演算部とToukaの他の部分とのインターフェースが必要になる。Inter Process Communicationがつかえるかも。また、__m128dなどのC言語の型のデータをIPCでバイナリなどで伝達して、Intrinsic演算部で再構築する必要がある。
例外を検出するためには、Touka本体からコマンドなどを使って、Intrinsic演算部を実行する必要がある。
そこで、__m128dなどの入力値をどうIntrinsic演算部に伝達するか、ToukaにIntrinsic演算部から出力値をどう伝達するかが問題となる。
手としては、別のバイナリで保存してあるファイルのファイルパスとインデックスをコマンドで転送して、Intrinsic演算部で取得する方法がある。
ファイルからデータを取得する部分が発する例外をテストしたい部分が発する例外から弁別する必要がある。
出力はファイルパスとインデックスの部分に挿入する。この方法ならIPCの実装は必要ない。
だがこの方法だと、テスト一回一回ファイルをロードしてセーブすることになる。多少オーバーヘッドがありそうだ。
(つづく。まだこの記事は書きます)