では、IntelのLinuxアプリケーションをRISC-Vにポートするときに使う戦略を考えていこう。
1,Intel Intrinsic Guideから、ポートするIntrinsic関数を選択する。
上のサイトより、ポートするIntrinsic関数を選択する。最初は副作用がないものが良いかもしれない。
2、選んだIntrinsic関数を使用したほんの小さなIntelで動くLinuxアプリケーションをC言語などで作成する。
副作用があるとテストなどが複雑になるので、最初は副作用のないものを選ぶ。
3,GCC、Intelのドキュメント、RISC-Vのドキュメント、Andes(RISC-Vのメーカー)のドキュメント、Linux on Power Porting Guideなどを読んで、選んだIntel Intrinsic関数をポートするためのRISC-V上で動くラップ構造を持つ移植ソースコードを作成する。
extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__,__artificial__))
_mm_add_pd (__m128d __A, __m128d __B)
{
return (__m128d) ((__v2df)__A + (__v2df)__B);
}
4,Intel Intrinsic関数とそれをRISC-Vにポートしたもののインプットとアウトプットのペアが同じであることを確認するためのテストフレームワークを作成する。
5,最初に作ったIntelで動くLinuxアプリケーションがRISC-Vにポートされ、RISC-Vで動くことを確認する。
6,すべてのIntel Intrinsic関数がポートされるまでこのプロセスを繰り返す。
7,世界のすべてのAWSやAzureのIntel Xeon CPUがRISC-Vに変更される。エネルギー消費が抑えられ、CO2排出量が減る。
必要な条件がいくつかある。
1,Intel Intrinsic関数を使用しているLinuxアプリケーションのオリジナルのソースコードを変更してはならない。あくまでexternなどの使われたファイルを追加するか、GCCを改修して対処する。なぜなら、Intel Intrinsic関数を使用したLinuxアプリケーションはプロプライエタリやオープンソースを含めて大量にあり、すべてを変更してテストすることは現実的ではない。
2,振る舞いやインプットとアウトプットのペアはIntel Intrinsic関数とそれをRISC-Vにポートしたものが同じである必要がある。
3,Intel Intrinsic関数とそれをRISC-Vにポートしたものでは、同じインプットなら同じ例外が起きる必要がある。
4,パフォーマンスはもちろん重要である。