
2025/12/24 21:40
**Show HN:** 「LoongArch ユーザースペースエミュレーター」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
(欠落している重要ポイントを組み込む)
Libloong は、アプリケーションに直接埋め込み可能な軽量で高性能な64ビット LoongArch エミュレータです。既存の RISC‑V フレームワーク上に構築され、コード行数は約18 kライン程度で、インタープリタ呼び出しオーバーヘッドが約4 nsと非常に高速(Lua の約150 nsや Java ランタイムを大きく上回り)です。CoreMark スコアは3000点超となり、64ビットインタープリタの中で最速と言えます。
このライブラリは LoongArch ベクトル LSX/LASX 命令に対応し、C++・Rust・Go バインディングを提供しており、外部依存関係は一切ありません。ファーストクラスの pause/resume サポート、実行タイムアウト/メモリ安全性、ゼロ依存埋め込み機能が備わっているため、ゲームエンジンスクリプティング(例:Asteroid デモ)や組み込みシステムに適しています。
開発者は構成可能なビルドオプション(、LA_DEBUG、LA_BINARY_TRANSLATION、LA_THREADED)を使用してパフォーマンスを調整できます。軽量 JIT を有効にするとネイティブ速度の約38 %に到達し、バイナリトランスレーションではネイティブの約77 %(31 962 CoreMark)が実現可能で、最大で約90 %まで上昇する見込みです。LA_MASKED_MEMORY_BITS
ベンチマーク結果は CoreMark が3000点超、C++ での STREAM copy/scale/add/triad レートが約33 146–31 388 MB/s、Rust スタイルの STREAM‑類似結果が Fill では27.9 GB/s、Copy では35.3 GB/s と報告されています。
クイックスタート:LoongArch ELF をロードし、64 MB のメモリを設定し、Linux 引数を構成してを呼び出します。CMake でビルドするには次のようにします。machine.simulate()cmake .. -DCMAKE_BUILD_TYPE=Release \ -DLA_MASKED_MEMORY_BITS=32 -DLA_BINARY_TRANSLATION=ON && make -j6ドキュメントには Integration Guide、API Reference、および LoongArch ISA の完全サポートが含まれています。
本文
64‑ビット LoongArch エミュレータライブラリ
高速で軽量なユーザースペースエミュレータライブラリです。
埋め込みアプリケーションやスクリプト用に設計され、 libriscv の実績ある構造を踏襲しつつ、コンパクト(約18 k行)のコードベースで競争力のあるインタープリタ性能を提供します。
- ディスカッションやサポートは Discord へご参加ください。
特徴
- LoongArch の高速インタープリタ(JIT をオプション)
- 非常に低い呼び出し遅延
- 64‑ビット LoongArch (LA64) 完全対応
- LSX と LASX ベクトル命令のサポート
- C++ API、Rust・Go バインディング付き
- 依存関係なし
- 実行タイムアウトとメモリ安全性
- 高度な一時停止/再開機能
デザイン
ゲームエンジン用スクリプトにおいて libloong は特に優れています。
従来のゲームは共有ライブラリ(システム全体へのアクセス)や Lua のような埋め込み VM(約150 ns の呼び出しオーバーヘッド)、あるいは Java ランタイムを用いてモディング機能を公開してきました。
Libloong は 約4 ns の呼び出し遅延で実現しています。
例として「Asteroid」ゲームをご覧ください。
ビルド
CMake の設定オプション:
LA_DEBUG=ON/OFF # デバッグ出力を有効化(デフォルト: OFF) LA_BINARY_TRANSLATION=ON/OFF # バイナリ翻訳を有効化(デフォルト: OFF) LA_THREADED=ON/OFF # スレッド付きバイトコードディスパッチを有効化(デフォルト: ON) LA_MASKED_MEMORY_BITS=N # マスクされたメモリアーケナサイズを 2^N バイトに設定 (0 = 無効、デフォルト: 0)
例:
cmake .. -DCMAKE_BUILD_TYPE=Release \ -DLA_MASKED_MEMORY_BITS=32 \ -DLA_BINARY_TRANSLATION=ON make -j6
クイックスタート
#include <libloong/machine.hpp> int main() { // LoongArch ELF バイナリをロード std::vector<uint8_t> binary = load_file("program.elf"); // 64 MB のメモリでマシンを作成 loongarch::Machine machine{binary, { .memory_max = 64 * 1024 * 1024 }}; // プログラム引数を設定 machine.setup_linux({"program"}, {"LC_ALL=C"}); // プログラムを実行 machine.simulate(); }
パフォーマンス
STREAM メモリベンチマーク
| 関数 | ベストレート (MB/s) | 平均時間 | 最小時間 | 最大時間 |
|---|---|---|---|---|
| Copy | 33 146.7 | 0.004884 | 0.004827 | 0.004962 |
| Scale | 27 825.2 | 0.005792 | 0.005750 | 0.005920 |
| Add | 31 388.6 | 0.007712 | 0.007646 | 0.007797 |
| Triad | 29 250.7 | 0.008268 | 0.008205 | 0.008379 |
Rust で書かれた STREAM ライクベンチマーク(例):
Fill 76.3 MiB rate 27.9 GB/s | time min 2.9ms avg 3.1ms max 3.3ms Copy 153 MiB rate 35.3 GB/s | time min 4.5ms avg 4.6ms max 5.0ms Scale 153 MiB rate 23.0 GB/s | time min 7.0ms avg 7.0ms max 7.1ms Add 229 MiB rate 31.9 GB/s | time min 7.5ms avg 7.6ms max 7.7ms Triad 229 MiB rate 11.1 GB/s | time min 21.5ms avg 21.6ms max 21.8ms
2025年末時点でレジスターマシンが依然としてトップですが、Libloong は現在最速の64‑ビットインタープリタであり、3000+ CoreMark を安定して達成します。
-
軽量 JIT: ネイティブ性能の約38 %(15.5k vs 41k CoreMark)で、インタープリタと完全に同等の機能を提供。
CoreMark 1.0 : 15580.375613 / GCC14.2.0 -O3 -DPERFORMANCE_RUN=1 / Static -
埋め込みバイナリ翻訳: ネイティブ性能の約77 %(上限≈90 %)に到達。
CoreMark 1.0 : 31962.238533 / GCC14.2.0 -O3 -DPERFORMANCE_RUN=1 / Static
ドキュメント
- 統合ガイド
- API リファレンス
- LoongArch ISA サポート