この記事では、IntelのIntrinsic関数をmilk-V Duoにポートするためのテストフレームワークを作ります。
今回は
__m256d _mm256_add_pd (__m256d a, __m256d b)
のIntel Intrinsic関数をmilk-Vにポートします。以下のドキュメントを参考にします。
上のIntel Intrinsic関数をOpenPOWERにポートしたソースコードが以下のようになります。
ソースコード(1)
typedef double __m256d __attribute__ ((__vector_size__ (32), __may_alias__));
extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__,
__artificial__))
_mm256_add_pd (__m256d __A, __m256d __B)
{
return (__m256d) ((__v4df)__A + (__v4df)__B);
}
このポートしたコードはRISC-Vでも使えると思います。
milk-V Duoのセットアップ方法は以下のリンク。
テストフレームワークは、ソースコード(1)の、Intel側のIntrinsic関数に__Aと__Bにランダムに生成した値を入力し、RISC-V側の__Aと__BにIntel側と同じ値を入力し、帰ってきた値が同じであることを確認します。このようにして、ポートしたソースコードが正確であることを担保します。
milk-V DuoでC言語を実行する方法は以下のリンク
まずは、__m256d
の値をランダムに生成するモジュールを作成する必要があります。
このサイトを参照すれば、__m256d
の値を生成するには、_mm256_set_ps(float, float, float, float, float, float, float, float)
のIntrinsic関数を使用する必要があるようです。
ただし、ランダムに生成した値をネットワークに乗せて伝達する必要があるため、テキストなどに変換するモジュールなども作る必要があります。
また、テストフレームワークで使うネットワークモジュールはRISC-Vなどでも使える必要があります。よって、C言語がいいかもしれません。ソケットプログラミングでいけるでしょう。
使うネットワークはセキュリティ上の理由から有線LANがいいでしょう。
UDPとTCPどちらを使うかは悩みどころです。
ネットワークトポロジは以下のようになります。
+-------+ +---------------+ +-----------+
| Intel |-----|Central Server |------| RISC-V |
+-------+ +---------------+ +-----------|
Central serverは今の所Intelになりそうです。Intrinsic関数を実行するIntelとは分離する必要がないように思えます。今のところはIntelとセントラルサーバは同じマシンの中でもいいかもしれません。ただ、アプリケーション的には分離したほうがいいでしょう。RISC-Vも、エミュレーションなどを使ってもいいかもしれません。
https://github.com/um4ng-tiw/Peer-to-Peer-Socket-C/tree/main
上のプログラムを参考に作ります。