0
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つの関数が同じ入力なら同じ結果を返すことを保証するテストフレームワーク(7)

0
Last updated at Posted at 2026-07-02

Toukaを使用するときの流れを以下に設計していく。
まずは、データを入力するときの元データを作成する。元データの作成はx86上で行う。

例えば、以下の _mm_add_ps をテスト対象とする場合を考える。

/* Perform the respective operation on the four SPFP values in A and B. */
extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__,
__artificial__))
_mm_add_ps (__m128 __A, __m128 __B)
{
    return (__m128) ((__v4sf)__A + (__v4sf)__B);
}

以上のソースコードにおいて、__Aと__Bに入力する値のセットをランダムに生成していく。生成したデータは以下の構造体を使ってバイナリファイルに保存する。

typedef struct{
    __m128 __A;
    __m128 __B;
}TOneIntrinsicOp;


#define MAXTOUKAVERSIONSTRING 200
#define MAXTOUKAINTRINSICOP  2000
#define MAXCOMMENTLENGTH 500
typedef enum {
    ENDIAN_LITTLE = 0,
    ENDIAN_BIG = 1
} EEndianType;

typedef struct{
    EEndianType EndianMode;
    char version[MAXTOUKAVERSIONSTRING];
    TOneIntrinsicOp intrinsicop[MAXTOUKAINTRINSICOP]; 
    char comment[MAXCOMMENTLENGTH]; 
}TOneToukaTestOp;

それらの同じファイルを、Intel x86とOpenPOWERのToukaに入力し、各環境での実行結果をログファイルなどとしてテキスト化して保存する。

x86とOpenPOWERにて生成されたテキストを同じPC上に置き、diffを取る。もしも出力値にズレがあった場合、diffによってズレは検出される。
OpenPOWERはローカル上で、qemuで動かすことが出来る。最終的には実機でテストしたい。
ToukaはすべてC++で作られる。

以下新たに出てきた課題

qNaNのビットパターンがアーキテクチャによって異なるので、そこも考えないといけない。

x86 (Intel/AMD): 0xFFC00000(符号ビットが 1 になることが多い)
ARM / OpenPOWER: 0x7FC00000(符号ビットが 0 になることが多い)

Nanの伝播パターンがアーキテクチャによって異なる。

「普通の数値 $A$」と「qNaN」を演算(例: $A + \text{qNaN}$)させた場合、結果はqNaNになる。しかし、「異なるペイロードを持つ NaN同士」を演算させた場合、どちらのビットパターンを引き継ぐかはCPU(またはコンパイラの最適化)に依存する。特に、MAX/MIN命令(例: _mm_max_ps)にNaNを渡したときの挙動は歴史的に非常に複雑で、x86とARM(NEON/SVE)で結果が真逆になるケースがある(x86は「片方がNaNならもう片方の数値を返す」挙動をする場合があるなど)。(ここは生成AIのをコピペしました)

以上事実関係の要確認と要解決。実機やqemuを動かして確認する必要があるかもしれない。

0
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
0
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?