1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

2つの関数が同じ入力なら同じ結果を返すことを保障するテストフレームワーク(6)

Last updated at Posted at 2026-01-15

テストフレームワーク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の実装は必要ない。
だがこの方法だと、テスト一回一回ファイルをロードしてセーブすることになる。多少オーバーヘッドがありそうだ。
(つづく。まだこの記事は書きます)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?