【问题标题】:How generated WebAssembly module looks with a lot of dynamic data生成的 WebAssembly 模块如何包含大量动态数据
【发布时间】:2018-04-27 20:55:06
【问题描述】:

假设会生成一个包含大量数据的 WebAssembly 模块(wat 格式)。一旦程序开始运行,数据将在运行时动态更改和更改。不太确定我是否理解将这些数据放在生成的 WebAssembly 模块中的什么位置。

我正在尝试完成(在 WebAssembly 中)这个 JavaScript 所展示的内容:

var data = [
  100.1, 100.2, 200.1, 200.2,
  300.12, 300.123, ...
]

我最终会做这样的事情:

var subset = data.slice(2, 4)
storeSubset(subset)
data[5] = 500.3
subset[2] = 600

...但在 WebAssembly 中不是 JavaScript,其中 datasubset 是某些函数的局部变量;它们不是全局变量。虽然如果有必要,可能有一个全球数据集。

想知道在生成的模块中放置数据的位置。所以程序将从一开始就将这些数据内置。基本上,有一些初始化数据会在运行时动态修改。

这就是我试图用伪代码完成的:

(module
  (load float16 memorylocation, 200.1)
  (load float16 memorylocation, 200.2)
  ... for every piece of data
)

不确定 (a) 是否应该与此类似(一次一件),或者 (b) 是否可以以某种方式批量完成。像这样:

(module
  (static memorylocation, 0101010110101...) ;; the bytes of all the `data`
  (block (loop ...)) ;; loop through it and do `(load ...)` for each,
  ;; not sure if that would be better / performance / etc.
  ...
)

将所有字节加载到一个位置并循环遍历它们?

或者也许有一种更标准的.data 功能,比如汇编(虽然我不确定这是否适合动态数据)。

(module
  (data float16 memorylocation, 200.1)
  (data float16 memorylocation, 200.2)
  ...
)

到目前为止,我了解如何在 WebAssembly 中执行 functions,只是不了解如何处理初始化数据,因为它似乎会生成大量的 WebAssembly,并且不确定应该是哪种 WebAssembly。

【问题讨论】:

  • 你用什么来生成你的代码?大概是C++代码吧?
  • 当然可以说它是 C++。但我想知道wat 的外观。

标签: webassembly


【解决方案1】:

WebAssembly 二进制文件包含一个 data segment 部分,该部分在调用 start 和实例开始运行之前复制到内存中。

C++ 编译器会将.rodata 的等价物和.data 的任何其他静态初始化放入其中。然后可以在运行时修改。

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 2019-07-17
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多