使用来自 javascript 的 const *const *inputs 调用 C webassembly 函数

Posted

技术标签:

【中文标题】使用来自 javascript 的 const *const *inputs 调用 C webassembly 函数【英文标题】:Calling C webassembly function with const *const *inputs from javascript 【发布时间】:2018-11-12 17:56:57 【问题描述】:

我打算通过 webassembly 使用 web 中现有的 c 库。

以下是我无法控制程序的库功能的要点

#include <stdio.h>
#include <stdlib.h>

int avg(int size, double const *const *inputs, double const *options, double *const *outputs) 
    const double *input = inputs[0];
    const int period = (int)options[0];
    double *output = outputs[0];
    const double scale = 1.0 / period;
    double sum = 0;

    int i;
    for (i = 0; i < period; ++i) 
        sum += input[i];
    

    *output++ = sum * scale;

    for (i = period; i < size; ++i) 
        sum += input[i];
        sum -= input[i-period];
        *output++ = sum * scale;
    

    return 0;

对于第三个参数*options 传递一个数组,我通常Module._malloc() 并在该内存指针位置设置所有必需的值后发送内存指针,如下所示,它工作正常

var optionsPointer = Module._malloc(options_required.length * 64);
var optionsValues = new Float64Array(Module.wasmMemory.buffer, optionsPointer, options_required.length);
optionsValues.set(option_values);

但是我将如何发送像double const *const *inputs(第二个)和double *const *outputs(最后一个)参数这样的参数。我尝试为第二个参数创建如下指针的指针数组,但没有成功。

var inputMemoryPointer = Module._malloc(size * 64);
var inputMemoryValues = new Float64Array(Module.wasmMemory.buffer, inputMemoryPointer, size);
inputMemoryValues.set(user_inputs[input]);

var inputsPointer = Module._malloc(64)
var inputsValues = new Float64Array(Module.wasmMemory.buffer, inputsPointer, 1);
inputsValues.set([inputMemoryPointer]);

如果有帮助,我会使用 emscripten 创建 wasm 和 javascript 包装器。

【问题讨论】:

【参考方案1】:

inputsValues 应该是 Uint32Array,而不是 Float64Array; emscripten 中的指针是 32 位无符号整数。

还要仔细检查分配的大小;我注意到您为 inputs 指针数组分配了 64 个字节,该数组可容纳 16 个指针,但只能设置一个。 (如果每次迭代有 16 个项目,那么只要您的真实代码设置其他项目就可以了。)

【讨论】:

谢谢。你是对的,一旦我将 float64 固定为 uint32,一切都开始正常工作了。

以上是关于使用来自 javascript 的 const *const *inputs 调用 C webassembly 函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥要设计一个库来在 Javascript 中使用 const [] 而不是 const ?

从java调用包含'const'的javascript?

JavaScript 学习-10.使用const声明常量

为啥许多javascript示例仍然使用'var'而不是'const'和'let'? [关闭]

Javascript 对象解构赋值是不是使用 const、let 或 var?

javascript 块范围使用let&const