C言語でテストフレームワークToukaを作るためには、処理のハブとなるC言語の構造体を定義していく必要がある。構造体を定義した上で、それらを処理するルーチンを記述していく。これがC言語でソフトウェアを作っていく基本のようだ。
では、必要となる構造体をリストしていこう。
コメントを格納する構造体とコメントを格納しない構造体がある。
- 一回のテストのデータを保存する構造体
入力値と出力値のペアを記録する必要がある他、SIMD演算が例外を発出した場合、どのように記録するか戦略を記述する必要がある。
typedef enum{
NoException = 0,
ExceptionRaise = 1
}EExceptionMode;
typedef enum{
Stored = 0,
NotStored = 1
}EStoredStatus;
typedef struct{
__m128d __A;
EStoredStatus __A_StoredStatus;
__m128d __B;
EStoredStatus __B_StoredStatus;
__m128d ReturnValue;
EStoredStatus ReturnValue_StoredStatus;
EExceptionMode ExceptionCode;
}TOneIntrinsicOp;
戻り値が設定されていないデータがありうるため、値が格納されているかどうかを確認するフラグをつけるか考える必要がある。どのようなフラグをつけるかも考える必要がある。
- __m128dがどのような型で構成されたベクトルかを示す列挙子
typedef enum{
Type__m128d,//以降他のSIMD型が続く
}EIntelSIMDType;
- 一連の同じ種類のテストのデータを保存する構造体
これは、構造体をそのままバイナリでファイル保存される。保存したファイルはIntel→OpenPOWERまたはIntel→RISC-Vのデータ受け渡しに使用する。
今回のプロジェクトは実験プロジェクトであるため、ファイルサイズは固定にする。最大のテスト格納数は2000としているが、適宜変更できる。
リトルエンディアンかビッグエンディアンかのデータを格納しておくフィールドが必要。
#define MAXTOUKAVERSIONSTRING 200
#define MAXTOUKAINTRINSICOP 2000
typedef enum {
ENDIAN_LITTLE = 0,
ENDIAN_BIG = 1
} EEndianType;
typedef struct{
EEndianType EndianMode;
char version[MAXTOUKAVERSIONSTRING];
TOneIntrinsicOp intrinsicop[MAXTOUKAINTRINSICOP];
char comment[MAXCOMMENTLENGTH];
}TOneToukaTestOp;
また、ビッグエンディアンとリトルエンディアンにまたがったファイル転送を行う場合は、フォーマットの変更が必要となる。