1
3

More than 1 year has passed since last update.

WebAssembly: Conditional Segment Initialization Proposals を眺める

Last updated at Posted at 2022-10-01

そんな WebAssembly Proposals 聞いたことないんだが

Bulk Memory Operations Proposals の一部になっている。もともとは別の WebAssembly Proposals だったが、Bulk Memory Operations Proposals に統合された...らしい。

Conditional Segment Initialization Proposals とは

WebAssembly data セクションの前提知識

WebAssembly Module の instantiate 時に、線形メモリに格納されるべき値を定義できる。

data セクションの例
(module
  (memory (export "memory") 1)
  (data (i32.const 16) "Hello, WebAssembly!\0")
)

上記の .wat だと、初期化時に線形メモリ上の先頭から 16 ~ 36バイトの範囲に、"Hello, WebAssembly!\0" のバイナリ表現が書き込まれる。

線形メモリ
     | 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |
---- | ----------------------------------------------- | ------------------
0000 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ........ ........
0010 | 48 65 6c 6c 6f 2c 20 57 65 62 41 73 73 65 6d 62 | Hello, W ebAssemb
0020 | 6c 79 21 00 00 00 00 00 00 00 00 00 00 00 00 00 | ly!..... ........

Conditional Segment Initialization Proposals があると

上記の線形メモリの初期化が WebAssembly Module の instantiate 時にしかできなかったのが、任意のタイミングで実行することが可能となる。

Conditional Segment Initialization Proposals の使い方

1. data オフセットを削除する

data オフセット (上記の例だと (i32.const 16)) がない data セグメントは、Passive Segment として取り扱われ、線形メモリの初期化には使われなくなる。

オフセットを削除した後
(module
  (memory (export "memory") 1)
  (data "Hello, WebAssembly!\0")
)

2. memory.init 命令を追加する

data セクション から線形メモリに書き込む WebAssembly OpCode が memory.init である。

(memory.init <セグメント番号>
      (i32.const <線形メモリの書き込み先オフセット>)
      (i32.const <書き込まれるセグメントのオフセット>)
      (i32.const <書き込まれるデータの長さ>))
memory.init の例
(memory 1)
(data "Hello, WebAssembly!\0")

(func $start
    ;; copy data segment 0 into memory 0 (the 0 is implicit)
    (memory.init 0
      (i32.const 16)    ;; 線形メモリの先頭から 16 バイトの位置に
      (i32.const 0)     ;; データセグメントの先頭から
      (i32.const 21))   ;; 21 バイトを書き込む
)

ほかにできることは?

  • Table の初期化も同様に任意のタイミングに遅延させることができる
  • data.drop 命令を使って、今後その data セグメントが使われないことを明示できる
    • 従来通りの data セグメントに対して data.drop 命令を使うことで実行時のメモリ使用量を削減できるかどうかは要調査

あとがき

  • Bulk Memory Operations Proposals は早い段階から知っていたが、data.drop の存在意義とかがいまいちわかっていなかった
  • Thread Proposals に Conditional Segment Initialization Proposals の記述があってなんだそれってなった
  • C/C++ からの使い所がわからない (
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3