RISC-VバイナリサイズがARMv9より最大24%小型化
今回の実験では、RISC-VとARMv9のISAを比較するため、Cコンパイラであるchibiccを自己コンパイルするタスクが用いられました。特に注目すべきは、SIMD命令を除外している点です。これにより、純粋なISAの特性が評価されています。
結果として、RISC-VのバイナリサイズはARMv9と比較して約18%小さく、動的命令長に至ってはRVA23がARMv9より24%少ないバイト数で済むことが示されました。これは、コード密度の面でRISC-Vが優位性を持つことを意味します。
RISC-Vバイナリの静的サイズはARMのものより約18%小さく、動的命令長ではRVA23がARMv9より24%少ないバイト数で実行されます。
個人的には、コード密度が高いのは組み込みやIoTデバイスなど、リソースが限られる環境では大きなメリットだと感じます。限られたキャッシュやメモリでより多くのコードを実行できるのは、パフォーマンス向上に直結するのではないでしょうか。特にスタートアップで新しいハードウェアを開発する際、このような特性は設計の自由度を高める要因になると考えられます。
動的命令数でARMが優位、しかしuopsレベルで拮抗
動的命令数(デコードされる命令の総数)では、ARMが平均で6.5%少ない命令数でタスクを完了しています。これは、ARMがより複雑な命令を持つため、より少ない命令で同じ処理を表現できることを示唆しています。しかし、注目すべきはマイクロオペレーション(uops)の比較です。
ARMの複雑なアドレッシングモードの一部は、CPU内部で複数のuopsに分解されることが知られています(Apple Silicon CPU Optimization Guideでも言及されています)。このuopsの数を考慮すると、clangでコンパイルされた場合、両ISAのuops数はほぼ同等になります。GCCではRISC-Vの方が少ないuopsで済む結果となりました。
| ISA | Compiler | Static Bytes | Dynamic Bytes | Dynamic Insns | uops (QEMU) | uops (GEM5) |
|---|---|---|---|---|---|---|
| RVA22 | clang-19 | 772K | 1221M | 424M | 424M | 438M |
| RVA22 | gcc-15 | 772K | 1309M | 445M | 445M | 459M |
| RVA23 | clang-19 | 772K | 1185M | 423M | 423M | 438M |
| RVA23 | gcc-15 | 772K | 1265M | 441M | 441M | 456M |
| armv9 | clang-19 | 944K | 1543M | 386M | 424M | 469M |
| armv9 | gcc-15 | 936K | 1688M | 422M | 460M | 501M |
このuopsレベルでの比較は非常に重要です。いくら命令数が少なくても、それが内部で複数のuopsに分解されるのであれば、実際のCPUサイクル効率は低下する可能性があります。
この結果を見ると、ARMの命令セットはデコードの段階では効率的に見えても、実行ユニットに供給されるuopsの観点では、RISC-Vとほぼ同等か、GCCではRISC-Vの方が優位な場面もあるということが分かります。私の普段のバイブコーディングではClaude Codeを多用していますが、命令セットレベルでの最適化はAIに任せつつ、このような低レベルのアーキテクチャ特性を理解しておくことは、やはり重要だと感じます。
GEM5によるシミュレーション結果の解釈
GEM5はサイクル精度のマイクロアーキテクチャシミュレータであり、異なるISAに対しても同様のマイクロアーキテクチャ(O3 CPUモデル)をシミュレートできるとされています。しかし、今回のGEM5シミュレーション時間は、注意して解釈する必要があります。異なるISA向けに最適化された同じ設計チーム、同じ予算でのCPUデザインが、GEM5のモデルで完全に再現されるとは限らないためです(出典)。
それでも、この特定のテストでは、RVA22とRVA23の両方がARMv9と同程度のシミュレーション時間を示しています。これは、命令セットの基本的な効率がシミュレーション上では大きく変わらない可能性を示唆していると言えるでしょう。
RISC-VとARMのどちらが優れているかという議論は続きそうですが、少なくとも今回の実験では、RISC-Vがコード密度で優位に立ちつつ、実効性能(uopsベース)ではARMと十分に競争できるレベルにあることが示されたと感じます。特に、オープンソースであるRISC-Vがここまで来たというのは、開発者として非常にワクワクするポイントです。自分でローカルLLMを動かす際も、低レイヤーの効率が重要になってくるため、今後もこの分野の進化には目を光らせていきたいですね。