使用来自 javascript 的 const *const *inputs 调用 C webassembly 函数
Calling C webassembly function with const *const *inputs from javascript
我打算使用 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 包装器(如果有帮助的话)。
inputsValues
应该是 Uint32Array,而不是 Float64Array;指针是 emscripten 中的 32 位无符号整数。
还要仔细检查分配的大小;我注意到您正在为 inputs
指针数组分配 64 个字节,这是 16 个指针的空间,但只设置一个。 (如果每次迭代有 16 个项目,那么只要您的真实代码设置了其他项目就可以了。)
我打算使用 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 包装器(如果有帮助的话)。
inputsValues
应该是 Uint32Array,而不是 Float64Array;指针是 emscripten 中的 32 位无符号整数。
还要仔细检查分配的大小;我注意到您正在为 inputs
指针数组分配 64 个字节,这是 16 个指针的空间,但只设置一个。 (如果每次迭代有 16 个项目,那么只要您的真实代码设置了其他项目就可以了。)