webassembly004 ggml wasm_eval 与js代码交互 调试

试用

$:~/ggml/ggml$cd examples/mnist
$:~/ggml/ggml/examples/mnist$ emcc -I../../include -I../../include/ggml -I../../examples ../../src/ggml.c main.cpp -o web/mnist.js -s EXPORTED_FUNCTIONS='["_wasm_eval","_wasm_random_digit","_malloc","_free"]' -s EXPORTED_RUNTIME_METHODS='["ccall"]' -s ALLOW_MEMORY_GROWTH=1 --preload-file models/mnist
cache:INFO: generating system asset: symbol_lists/a262e86b2699be8569b00ee0af7e34a0a05c5b5e.json... (this will be cached in "/home/pdd/Downloads/emsdk/upstream/emscripten/cache/symbol_lists/a262e86b2699be8569b00ee0af7e34a0a05c5b5e.json" for subsequent builds)
cache:INFO:  - ok
  • 启动一个服务$:~/ggml/ggml/examples/mnist/web$ python -m http.server
    在这里插入图片描述

在这里插入图片描述

与js代码交互

使用ccall 从JavaScript调用已编译的C函数

  • 从JavaScript调用已编译的C函数的最简单方法是使用ccall()或cwrap()。ccall()用指定的参数调用一个编译后的C函数并返回结果,而cwrap()则“包装”一个编译过的C函数,并返回一个可以正常调用的JavaScript函数。因此,如果您计划多次调用已编译的函数,cwrap()会更有用。

函数的实现代码

#ifdef __cplusplus
extern "C" {
#endifint wasm_eval(uint8_t * digitPtr) {mnist_model model;if (!mnist_model_load("models/mnist/ggml-model-f32.bin", model)) {fprintf(stderr, "error loading model\n");return -1;}std::vector<float> digit(digitPtr, digitPtr + 784);int result = mnist_eval(model, 1, digit, nullptr);ggml_free(model.ctx);return result;
}int wasm_random_digit(char * digitPtr) {auto fin = std::ifstream("models/mnist/t10k-images.idx3-ubyte", std::ios::binary);if (!fin) {fprintf(stderr, "failed to open digits file\n");return 0;}srand(time(NULL));// Seek to a random digit: 16-byte header + 28*28 * (random 0 - 10000)fin.seekg(16 + 784 * (rand() % 10000));fin.read(digitPtr, 784);return 1;
}#ifdef __cplusplus
}
#endif

js中调用代码

// Call C from JavaScript
var result = Module.ccall('int_sqrt', // name of C function'number', // return type['number'], // argument types[28]); // arguments

调试

// 在chrome edge运行都没有问题,但是在火狐运行会报错(官方的网页在火狐能够正常运行)
Uncaught RuntimeError: index out of boundscreateExportWrapper http://127.0.0.1:8000/mnist.js:876ccall http://127.0.0.1:8000/mnist.js:4875predict http://127.0.0.1:8000/:46  # predict函数报错onRandom http://127.0.0.1:8000/:69onclick http://127.0.0.1:8000/:1
mnist.wasm:360562:1
  • 生成的minist.js
    在这里插入图片描述
    /*** @param {string|null=} returnType* @param {Array=} argTypes* @param {Arguments|Array=} args* @param {Object=} opts*/var ccall = function(ident, returnType, argTypes, args, opts) {// For fast lookup of conversion functionsvar toC = {'string': (str) => {var ret = 0;if (str !== null && str !== undefined && str !== 0) { // null string// at most 4 bytes per UTF-8 code point, +1 for the trailing '\0'ret = stringToUTF8OnStack(str);}return ret;},'array': (arr) => {var ret = stackAlloc(arr.length);writeArrayToMemory(arr, ret);return ret;}};function convertReturnValue(ret) {if (returnType === 'string') {return UTF8ToString(ret);}if (returnType === 'boolean') return Boolean(ret);return ret;}var func = getCFunc(ident);var cArgs = [];var stack = 0;assert(returnType !== 'array', 'Return type should not be "array".');if (args) {for (var i = 0; i < args.length; i++) {var converter = toC[argTypes[i]];if (converter) {if (stack === 0) stack = stackSave();cArgs[i] = converter(args[i]);} else {cArgs[i] = args[i];}}}var ret = func.apply(null, cArgs);function onDone(ret) {if (stack !== 0) stackRestore(stack);return convertReturnValue(ret);}ret = onDone(ret);return ret;};
  • 可以打断点
    在这里插入图片描述
  • 然后运行到wasm代码在这里插入图片描述

同一段代码在chrome , firefox对比

        我在minist.js加入了一个输出,firefox好像给我优化掉了,并且对于同一个wasm的解释方式也有不同,截图如下

  • chrome
    在这里插入图片描述
    在这里插入图片描述
  • firefox在这里插入图片描述

在这里插入图片描述

CG

  • WASM throws memory access out of bounds in Chrome but not Firefox/Edge

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1620723.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

cesium 使用天地图

天地图的 key 可以到 天地图官网申请 我的天地图账号是如下 天地图的最大层级是17 &#xff0c;当我们设置maximumLevel 小于 等于17 级时&#xff0c;当相机移到LOD大于17时&#xff0c;会对天地图 最大层级图像进行切分&#xff1b; 当设置maximumLevel 大于17级时&#xf…

ArcGis for JavaScript 4.23版本接入国家天地矢量地图

申请天地图开发权限 注册天地图控制台创建应用&#xff0c;应用类型选浏览器端&#xff0c;因为我们是浏览器使用创建完成后进入资源服务选择使用的地图&#xff0c;此处我使用经纬度矢量地图点击进去可以看到地图服务的URL 后面要用 ArcGis 接入天地图 ArcGis 4x版本中使用…

cesium-加载天地图影像

cesium-加载天地图影像 天地图 “天地图”网站装载了覆盖全球的地理信息数据&#xff0c;这些数据以矢量、影像、三维3种模式全方位、多角度展现&#xff0c;可漫游、能缩放。其中中国的数据覆盖了从宏观的中国全境到微观的乡镇、村庄。普通公众登录“天地图”网站&#xff0…

Android 加载天地图

Android 通过ArcGis 来加载天地图&#xff0c;研究了一个星期 整理成了一个小demo,附上部分源码&#xff0c;底部附上源码demo, package com.luao.arcgisdemo;import android.Manifest; import android.annotation.SuppressLint; import android.app.admin.SystemUpdateInfo;…

天地图各级比例尺

国家地理信息公共服务平台天地图 在实际调用中发现国际级可用的为1到18级 &#xff0c;点击省市服务可放大到20级&#xff0c;以下提供1到20级的比例尺供大家参考。 天地图 4.0 API 点击省市服务可放大到20级 L1 1:295829355.45456564 L2 1:147914677.7272828…

OpenLayers集成天地图

1、安装OpenLayers 使用以下方式将OpenLayers添加为对您的应用程序的依赖 npm i -S ol 此时&#xff0c;您可以要求NPM通过运行以下命令来添加所需的开发依赖项 npm i --save-dev parcel-bundler 2、注册天地图 注册地址&#xff1a;https://uums.tianditu.gov.cn/registe…

天地图之自定义标记点

需求&#xff1a;在地图上标记监控点位&#xff0c;地图引入的过程就不多啰嗦&#xff0c;可参考此专栏前几篇文章&#xff0c;下面直接介绍实现步骤 1.绘制标记点&#xff08;如果多个点则需要放到循环体循环渲染&#xff09; 点的坐标 var position new T.LngLat(经度, 纬…

java+天地图,天地图开发之Android-天地图显示

最近开始学Android地图开发&#xff0c;由于做天地图api的人不多&#xff0c;想把自己这一段时间的劳动成果分享给大家&#xff0c;顺便可以一起学习。我用的版本是天地图移动API(Android)V2.1版。 1.下载天地图移动API库 2.第一个天地图map应用 第一步&#xff1a;在工程里新建…

Cesium调用天地图的新问题

在开发CSTK 的过程中&#xff0c;尝试在Cesium上加载天地图&#xff0c;这个过程在2021年的年中已经解决了。 使用了网上的代码 viewer new Viewer("cesiumContainer", {// imageryProvider: imageryProvider,// imageryProvider: imgMap,baseLayerPicker: hasBase…

【天地图】使用天地图api绘制GeoJson数据

天地图没有直接提供加载GeoJson数据或者文件的api,但是我们可以借助绘制多边形的方式实现 1 实现效果 绘制如下的矢量多边形效果&#xff1b; 2 实现技术 (1) 首先用ajax请求geojson文件&#xff0c;从文件解析并获取到坐标数据 下面这个方法就是解析geojson返回的featurecol…

【自学笔记】天地图添加标注

知识点 MarkTool类&#xff1a;标注工具&#xff0c;用来让用户在地图上标注一个点&#xff0c;可以通过该工具获得用户标点的经纬度位置。构造函数&#xff1a;MarkTool(map:Map[,opts:MarkToolOptions])。参数说明&#xff1a;map为地图对象&#xff1b;opts&#xff1a;Mar…

离线地图最终解决方案

离线地图最终解决方案 前言 ​ 能找到这个帖子的朋友应该是公司要求做离线地图,但是没了解过的吧,我前一段也是公司要求做离线地图但是我没了解过,我就去搜了很多文章,找了很多方案,最后和leader定下来了两个方案,一个是使用一张固定缩放的图片,然后将像素转化为px来做…

天地图入门使用

“天地图”是国家测绘地理信息局建设的地理信息综合服务网站。集成了来自国家、省、市&#xff08;县&#xff09;各级测绘地理信息部门&#xff0c;以及相关政府部门、企事业单位 、社会团体、公众的地理信息公共服务资源&#xff0c;如果做的项目是政府部门、企事业单位尽量选…

javaee spring 自动注入,如果满足条件的类有多个如何区别

如图IDrinkDao有两个实现类 方法一 方法二 Resource(name“对象名”) Resource(name"oracleDrinkDao") private IDrinkDao drinkDao;

如何手动添加 WIFI 网络步骤

电脑手动添加WiFi网络步骤&#xff1a; 1.右键控制面板 2.进入控制面板 3.进入网络和Internet&#xff0c;点击设置新的连接或网络 4.点击手动连接到无线网络 5.输入网络SSID及秘钥 若需要自动连接请勾选自动启动此连接。 若WiFi不广播也自动连接请勾选即使网络未进行广播也连接…

【电脑设置wifi大揭秘】随身wifi怎么用?

随身wifi什么&#xff1f;一句话就是一种迷你版无线路由器&#xff0c;安装在台式机上也可充当无线网卡。目前&#xff0c;市面上的随身wifi有小度wifi、360随身wifi、wifi宝等。作为线上入口&#xff0c;互联网大佬们自然不会放手。 一、随身WiFi怎么用&#xff1f; 实际上&am…

计算机wifi怎么打不开,设置wifi的网址打不开怎么办?

问&#xff1a;设置wifi的网址(网站)打不开&#xff0c;无法对wifi进行设置&#xff0c;请问怎么解决这个问题&#xff1f; 答&#xff1a;wifi的设置网址打不开&#xff0c;多半是你操作有误引起的&#xff0c;极少数情况下是wifi路由器有问题导致的&#xff0c;这个问题的解决…

Windows下用某品牌随身WiFi搭建一个钓鱼热点

*本文原创作者&#xff1a;Leslie___Cheung &#xff0c;本文属于原创博客&#xff0c;未经许可禁止转载。 *本文内容仅代表作者观点且只做测试展示&#xff0c;目的是提醒读者注意 WiFi 联网安全&#xff0c;严禁将内容用于不法用途。 目录 前言 01 搭建过程 第一步&a…

随身wifi折腾日记 (刷armbian搭建服务器,内网穿透部署网站)

随身wifi折腾日记 跳转博客,观感更佳 商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source. 协议(License)&#xff1a;署名-非商业性使用-…

网络基础 ----------- 电脑设置为wifi站点

在上大学的时候最难受的就是&#xff0c;没有无线&#xff0c;但是电脑有宽带&#xff0c;那么怎么将电脑变成路由器哪 1、首先查看你的无线网卡是否支持开无线 通过命令win R 快捷件进入命令窗口输入 &#xff1a; 、 netsh wlan show drivers //查看你的无线网卡是否支持…