我用C编写了一个矩阵乘法程序,并使用Emscripten和以下命令进行编译
emcc matrix.c -o matrix.wasm -s STANDALONE_WASM
C程序如下,
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int matrix() {
int a[101][101];
int b[101][101];
int r[101][101];
for(int i = 0; i<101; i++) {
for(int j = 0; j<101; j++) {
a[i][j] = rand()%1000+1;
b[i][j] = rand()%1000+1;
}
}
for(int i = 0; i<101; i++) {
for(int j = 0; j<101; j++) {
r[i][j] = 0;
for(int k = 0; k<101; k++) {
r[i][j] += a[i][k] * b[k][j];
}
}
}
return 0;
}
int main(){
clock_t start, finish;
double duration;
start = clock();
matrix();
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf("computing duration: %fsn", duration);
return 0;
}
然后我用wasmer直接运行这个webassembly文件:
CCD_ 2。
它返回了预期的结果。然后我想用一个特定的函数来执行这个文件,即webassembly文件中的导出函数。
我使用wasm2wat将这个可执行文件转换为wat文件。然后我找到了(export "_start" (func 6))
。顺便说一下,我没有找到任何关于导出矩阵函数的代码。然后我用以下命令执行matrix.wasm:
wasmer matrix.wasm -i _start
然而,错误出现了。上面写着:
error: failed to run `matrix.wasm`
╰─> 1: Error while importing "wasi_snapshot_preview1"."clock_time_get": unknown import. Expected Function(FunctionType { params: [I32, I64, I32], results: [I32] })
然后我尝试Rust编写一个简单的程序,其中只包含一个main函数和一个add函数。我使用cargo将其编译为两种目标,即wasm32-unknown-unknown和wasm32-wasi。我把它们汇编成wat文件。这次我找到了(export "add" (func $add.command_export))
。当我用执行wasm32 wasi程序时
wasmer add.wasm -i add
也出现了错误。上面写着:
error: failed to run `hello.wasm`
╰─> 1: Error while importing "wasi_snapshot_preview1"."args_get": unknown import. Expected Function(FunctionType { params: [I32, I32], results: [I32] })
我可以正确执行目标为wasm32未知未知的文件,但我不能在这种目标中使用lib函数。
我认为我的wasm32-wasi文件有问题,但我不知道为什么以及如何处理。你能告诉我如何在wasm32-wasi文件中调用导出函数,以及如何在wasm22-wasi未知文件中调用lib函数吗。此外,我还有一些问题,为什么我使用Emscripten编译C文件,但矩阵函数不导出到wat文件中。非常感谢。
编译器通常会内联函数并删除未使用的代码,这就是为什么C程序最终会包含_start
函数中的所有内容。如常见问题解答中所述,您可以列出要使用emcc -s EXPORTED_FUNCTIONS=_main,_matrix
导出的函数,以防止它们被内联或删除。添加这些结果会导致wasm模块正确导出函数。
至于直接运行函数,wasmer run的源代码有逻辑来确定哪个运行时环境应该向模块公开。但是,如果您通过-i function
,它将完全跳过环境设置并直接运行您的函数。在这种情况下,模块无法初始化,因为它从WASI导入函数(以便将内容写入控制台,并获取当前时钟时间(。
我相信wasm32-unknown-unknown
工作的原因是它不链接到任何运行时,并且为它无法模拟的东西实现了伪接口(所有文件系统调用都会导致错误等(
总之,wasmer run -i function
并不意味着从具有导入的模块中运行函数,因此可能会对wasmer-cli
进行修补,但我不确定它是否适用于所有运行时环境。