RISC-Vエミュレーションの限界に挑む:ネイティブ実行にどこまで迫れるか
Pushing the limits of RISC-V emulation

OpenVMの開発者が、RISC-Vプログラムを非RISC-Vマシン上でネイティブに近い速度で実行する方法を探る。基本インタプリタから始め、事前デコード、computed goto、末尾呼び出しスレッディング、そしてAOTリコンパイラへと進化させる。リコンパイラは基本ブロックをC関数として生成し、Clangのpreserve_none呼び出し規約を活用してゲスト状態をホストレジスタに保持することで、オーバーヘッドを最小限に抑える。
プログラムを最速で実行する方法は、プログラムの邪魔をせず、ハードウェアに直接実行させることだ。
HNでの議論
35- oso2k
著者が元のエミュレーションが1/10の速度で動いたことに驚いていたのには感心しなかった。過去50年間、それが通常「(アクセラレーションなしの)エミュレーションが十分良い」とみなされる目標だったからだ。特に、現在進行形または開発中のアーキテクチャや、何らかの命令変換を必要とするアーキテクチャではなおさらだ。
この30年で、動的再コンパイル、ファットバイナリ、JIT VM、プロファイルガイド最適化といった革新が見られた。そのため、実行時性能が桁違いに劣るという期待が生まれた。我々は夢のような時代に生きている。
- beholdo
CPUアーキテクチャは進化し、しばしば置き換えられる。例えばMacは68k→Power→x86→ARMと移行してきたし、Windows PCも32ビットから64ビットに飛躍した。SIMDについても同じことが言える。
なぜOSはLLVMバイナリのような実行ファイルをサポートして、ロード時にネイティブコードを生成しないのだろうか?
これによりエミュレータの必要性を含む多くの問題が解決するだろう。なぜなら、すべてのバイナリがすべてのCPUで動作し、OSがロード時に最適なコードを生成するからだ。
CPU検出は不要になり、ベクター処理は常に利用可能な最新かつ最も広い命令で動作する。CPUは古いレガシー命令を心配せずに廃止できるなど、多くの利点がある。
- MiroslavPokorny
私が見た中で最もクールなインタプリタ技術は、命令本体を静的関数に置き、"コンパイラ"のメインループがその関数の本体をメモリから実行されるストレートラインコードにmemcpyするというものだった——貧者のJITだ。すべての命令関数は同じ引数を持ち、gccは同じ予測可能なレジスタ呼び出し規約で位置独立コードを生成した。非常に壊れやすいが、コンパイル速度は素晴らしく、実行時オーバーヘッドは低かった。解釈コードをコンパイルコードの1/5の速度で実行できた。典型的な高度に最適化されたcomputed gotoループインタプリタの1/10と比較してだ。
リンクは見つからないが、もし誰かがそのようなJITインタプリタを覚えていたり書いたりしたなら、投稿してほしい。