Как выглядит сгенерированный модуль WebAssembly с большим количеством динамических данных - PullRequest
0 голосов
/ 27 апреля 2018

Скажем, модуль 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, где data и subset являются локальными переменными для некоторой функции; они не являются глобальными переменными. Хотя, возможно, существует один глобальный набор данных, если это необходимо.

Хотите знать, где разместить данные в сгенерированном модуле. Таким образом, в программу будут встроены эти данные с самого начала. В основном, есть некоторые данные инициализации, которые будут динамически изменяться во время выполнения.

Вот что я пытаюсь выполнить в псевдокоде:

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

Не уверен (а), если это должно быть сделано аналогично этому (по одной части за раз), или (б) это может быть сделано как-то навалом. Как это:

(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, но не то, как обращаться с данными инициализации, потому что кажется, что он сгенерирует lot WebAssembly, и не уверен что это за WebAssembly.

1 Ответ

0 голосов
/ 28 апреля 2018

Двоичные файлы WebAssembly содержат сегмент данных , который копируется в память до вызова start и до запуска экземпляра.

Компилятор C ++ поместил бы эквивалент .rodata и любую другую статическую инициализацию для .data. Затем это можно изменить во время выполнения.

...