WebAssemblyランタイム比較(Lucet, Wasmer, Wasmtime)
https://zenn.dev/zaki_yama/scraps/cd40f7535b3224
wasi-sdk + wasmer-python で C/C++ アプリを WASM でポータブルに動かすメモ
https://qiita.com/syoyo/items/300d4ef7fd105e69ad10
WASI で動かすのは wasmer, wasmtime が主にありましたが,
最近(2022/09 時点), WasmEdge というのも出てきました.
AOT(Ahead of time) compile で高速実行目指す?っぽい.
C/C++ アプリを速度落とさずのサンドボックス実行できそうな気がしますので試してみます.
- wasmer(C/C++ をポータブルなプラグインにして Python で呼んだりしたいときとか)
- wasmtime : 最近(2022/09) 1.0 リリースされてセキュリティ的に安心して使いたいとき用?
- WasmEdge : C/C++ アプリを限りなく爆速で sandbox(isolation)実行したいとき用?
という感じの棲み分けになるのでしょうか...
SIMD, thread
wasmtime とかと違い?(一応 wasmtime とかでもサポートされているようではあるが...)
SIMD, thread が使えます.
ただどれだけセキュアに使えるかどうかは不明です.
TinyGLTF を動かす.
TinyGLTF を試してみます. thread や SIMD は使っていません.
まず wasi-sdk あたりで .wasm
作っておきます.
その後, wasmedgec
で .wasm
を AOT コンパイルします(数分くらいかかりました)
$ wasmedgec loader_example.wasm loader_example.aot.wasm
あとは実行するだけです!
--dir
でファイルアクセスを許可するフォルダを指定します. ../
など親フォルダはダメでしたので, カレントディレクトリあたりにファイルを置いておきましょう.
$ wasmedge --dir . loader_example.aot.wasm Cube.gltf
Reading ASCII glTF
=== Dump glTF ===
asset.copyright :
asset.generator : VKTS glTF 2.0 exporter
asset.version : 2.0
asset.minVersion :
=== Dump scene ===
defaultScene: 0
scenes(items=1)
..
Voila!
thread 対応
WASM 自体では C/C++ のネイティブな Thread 対応は現状(2022/09 時点)無理です.
現状ですと C から JS レイヤーで Worker を建てる感じでの対応になっています.
SIMD
実行側で SIMD 機能のある CPU が必要になりそうな予感...?
あと, WASM SIMD は iOS Safari では対応していませんので, 同じ WASM バイナリをブラウザで動かしたいときなどは SIMD on/off でコンパイルし直しが必要になります.
TODO
- WasmEdge の thread API を試してみる.