一、什么是Javascript实现GPU加速?

CPU与GPU设计目标不同,导致它们之间内部结构差异很大。

CPU需要应对通用场景,内部结构非常复杂。

而GPU往往面向数据类型统一,且相互无依赖的计算。

所以,我们在Web上实现3D场景时,通常使用WebGL利用GPU运算(大量顶点)。

但是,如果只是通用的计算场景呢?比如处理图片中大量像素信息,我们有办法使用GPU资源吗?这正是本文要讲的,GPU通用计算,简称GPGPU。

二、实例演示:色块识别。

如下图所示,我们识别图片中彩虹糖色块,给糖果添加表情。

2.2、运行代码:

1 var rgb2hsv = function(r, g, b) {2 var max = Math.max(r, g, b), min =Math.min(r, g, b),3 d = max -min,4 h,5 s = (max === 0 ? 0 : d /max),6 v = max / 255;7 switch(max) {8 case min: h = 0; break;9 case r: h = (g - b) + d * (g < b ? 6: 0); h /= 6 * d; break;

10 case g: h = (b - r) + d * 2; h /= 6 * d; break;

11 case b: h = (r - g) + d * 4; h /= 6 * d; break;

12 }13 return{14 h: self.hueIndexs[parseInt(h*360)],15 s: s,16 v: v17 }18 };

运行次数:262144次

2.3、测试结论:

实例中,我们分别使用GPU和CPU进行色相转换(防止光线影响识别准确度),其余步骤均一致。

测试平台

测试结论

PC

GPU较CPU优势较少

iOS

GPU较CPU优势较少

Android

vivoX20(运行10次平均)

CPU:770ms,GPU:270

GPU较CPU快2.85倍

三星S7(运行10次平均)

CPU:982ms,GPU:174ms

GPU较CPU快5.64倍

2.4、使用GPGPU意义:

GPU与CPU数据传输过程,与GPU实际运算耗时相当,所以使用GPU运算传输成本过高,实测在Android中具有较大优势。

本测试案例是从webAR项目中抽取,需要实时跟踪用户摄像头处理视频流(256*256),使用GPU计算意义非常大,否则无法实现实时跟踪。

三、如何实现GPU通用计算?

3.1、首先,我们通过一张流程图,演示原理:

3.2、实现:

3.2.1、创建顶点着色器,只是传递了贴图坐标。

1 attribute vec4 position;2 varying vec2 vCoord;3 voidmain() {4 vCoord = position.xy * 0.5 + 0.5;5 gl_Position =position;6 }

3.2.2、创建片元着色器,根据贴图坐标贴图。

1 precision highp float;2 varying vec2 vCoord;3 uniform sampler2D map;4 void main(void) {5 vec4 color =texture2D(map, vCoord);6 gl_FragColor =color;7 }

3.3.3、根据如上着色器代码,创建程序对象,变量code是我们要传入的用于计算的代码。

1 //绑定并编译着色器程序

2 var vertexShaderSource = '...';3 var fragmentShaderSource = '...' + code + '...';4 var vertexShader =gl.createShader(gl.VERTEX_SHADER);5 gl.shaderSource(vertexShader, vertexShaderSource);6 gl.compileShader(vertexShader);7 var fragmentShader =gl.createShader(gl.FRAGMENT_SHADER);8 gl.shaderSource(fragmentShader, fragmentShaderSource);9 gl.compileShader(fragmentShader);10

11 //创建程序对象

12 var program =gl.createProgram();13 gl.attachShader(program, vertexShader);14 gl.attachShader(program, fragmentShader);15 gl.linkProgram(program);16 gl.useProgram(program);

3.3.4、传入顶点数据,创建一个面覆盖整个画布。

1 //顶点数据传输

2 var vertices = new Float32Array([-1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0]);3 var vertexBuffer =gl.createBuffer();4 gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);5 gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);6 var aPosition = gl.getAttribLocation(program, 'position');7 gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, 0, 0);8 gl.enableVertexAttribArray(aPosition);

3.3.5、传入原始数据,本例中传入我要处理的图像数据,作为贴图,最终绘制到屏幕。

1 var gl = this.gl;2 var program = this.program;3 var texture =gl.createTexture();4 var uMap = gl.getUniformLocation(program, 'map');5

6 gl.activeTexture(gl.TEXTURE0);7 gl.bindTexture(gl.TEXTURE_2D, texture);8

9

10

11 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);12 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);13 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);14 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);15 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);16 gl.generateMipmap(gl.TEXTURE_2D);17

18 gl.uniform1i(uMap, 0);19

20 //绘制

21 gl.clearColor(0, 0, 0, 1);22 gl.clear(gl.COLOR_BUFFER_BIT);23 gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);

3.3.6、从最终绘制的画面上,获取颜色信息作为最终处理结果数据。

1 var pixels = new Uint8Array(gl.drawingBufferWidth * gl.drawingBufferHeight * 4);2 gl.readPixels(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);

其实清楚原理后,整体实现比较简单。

但是对于不了解WebGL的同学来说,理解上有一定难度,我后续准备写一个系列的WebGL教程,有兴趣的同学可以关注。

四、有无现成类库?

大家可以看到,我实现的gpu.js中,并没有将javascript转换成着色器语言(类C),而是用户直接传入着色器代码。但是github上已有将javascript转换为着色器语言的库。

https://github.com/gpujs/gpu.js

为什么我没有直接使用呢?

1、简单的使用,2k可以实现的代码,不想引入200k的库;

2、数据输入输出可以由自己灵活控制;

3、着色器语言很简单,特别只是使用基础运算逻辑的代码,没必要由库从Javascript转换。

没有WebGL基础的同学,建议直接使用https://github.com/gpujs/gpu.js,从本文理解整体逻辑;

有一定基础的同学,建议由http://tgideas.qq.com/2018/brucewan/gpu.js自己定制,更为灵活。

另外,这个组件我没打算深度封装,也没打算维护……嗯,就这样。

float gpu 加速_Javascript如何实现GPU加速?相关推荐

  1. float gpu 加速_根本没有GPU加速

    图形特征的状态 帆布:硬件加速 闪光:硬件加速 Stage3D硬件加速的闪光: Stage3D硬件加速的基线资料:闪光 合成:硬件加速和螺纹 光栅化:软件,硬件加速不可用 螺纹栅格化:禁用 视频解码: ...

  2. OpenCV之gpu 模块. 使用GPU加速的计算机视觉:GPU上的相似度检测(PNSR 和 SSIM)

    GPU上的相似度检测(PNSR 和 SSIM) 学习目标 在 OpenCV的视频输入和相似度测量 教程中我们已经学习了检测两幅图像相似度的两种方法:PSNR和SSIM.正如我们所看到的,执行这些算法需 ...

  3. ICP算法加速优化--多线程和GPU

    LZ之前的文章ICP算法实现(C++) 用C++实现了基础的ICP算法,由于该算法是一种迭代的优化算法,里面含有大量循环操作以及矩阵运算,可以通过使用多线程或者GPU硬件来进行加速,具体分别可以通过O ...

  4. css怎么使用gpu加速,用CSS3开启GPU硬件加速来提升网站的动画渲染性能

    CSS3为咱们开发动画效果大大提升了效率,但有些动画效果,如果涉及的DOM元素比较多,会发现有"卡卡"的感觉,为动画DOM元素添加CSS3样式 -webkit-transform: ...

  5. 服务器开虚拟机总是gpu满载,vSphere 环境机器学习 GPU 加速方案选型

    GPU 已经成为支撑 AI 应用的一种关键计算加速设备,GPU 的多处理器架构非常适合用来加快深度神经网络应用中的大量矩阵运算过程.大量实测数据表明,跟通用处理器相比,GPU 在运行深度神经网络时具有 ...

  6. matlab win10 gpu加速,win10怎么开启gpu加速有用吗 GPU硬件加速设置方法介绍

    win10怎么开启gpu加速有用吗 GPU硬件加速设置方法介绍 作为Windows 10的一项重要功能,微软在分享了GPU硬件加速细节后,现在还为大家送上了开启它的技巧,对于中低端设备来说,提升效果还 ...

  7. gpu浮点计算能力floaps_聊聊 GPU 峰值计算能力

    1.前言 2020 年 5 月 14日,在全球疫情肆虐,无数仁人志士前赴后继攻关新冠疫苗之际,NVIDIA 创始人兼首席执行官黄仁勋在自家厨房直播带货,哦不对应该是 NVIDIA GTC 2020 主 ...

  8. 训练神经网络gpu占用率低,外接gpu 训练神经网络

    为什么要用GPU来训练神经网络而不是CPU? 许多现代神经网络的实现基于GPU,GPU最初是为图形应用而开发的专用硬件组件.所以神经网络收益于游戏产业的发展. 中央处理器(central proces ...

  9. 模型推理加速系列|如何用ONNX加速BERT特征抽取(附代码)

    简介 近期从事模型推理加速相关项目,所以抽空整理最近的学习经验.本次实验目的在于介绍如何使用ONNXRuntime加速BERT模型推理.实验中的任务是利用BERT抽取输入文本特征,至于BERT在下游任 ...

最新文章

  1. 【Linux】 Linux简单操作之网络通信和网络访问
  2. 微信小程序,是不是一盘可口的菜!
  3. Python使用tkinter构建一个多元回归预测模型GUI界面(接受用户输入数据并给出模型推理结果)
  4. Java中对象的复制
  5. MySql 中锁的定义
  6. linux之scp命令
  7. React单元测试:Jest + Enzyme(二)
  8. 抽取类的#技巧#成员变量最可能
  9. JMM内存模型详解(一)
  10. 网络管理与维护作业9
  11. 设计并搭建Python容器化项目的CI/CD流水线
  12. AppleALC.kext驱动支持的硬件型号与ID速查列表:
  13. layui 表单验证案例
  14. Greenplum单机版安装
  15. 8051单片机的C语言程序设计
  16. 行政区域村级划分数据库_两区划定数据库规范标准
  17. 电池SOC仿真系列-基于GA-BP神经网络的电池SOC估算方法
  18. 山东省第二届数据应用创新创业大赛-济南赛场赛题发布
  19. 大数据舆情分析:全方位解读《战狼2》
  20. php绑定银行卡实现,php网站如何绑定银行卡

热门文章

  1. win10+Vmware14+Centeros7.6 mini网络设置
  2. Android2D绘图四
  3. 傲游浏览器linux傲游源,Ubuntu下安装遨游浏览器
  4. mysql where不能用聚合函数_Mysql聚合函数对where语句筛选结果的影响
  5. python做马尔科夫模型预测法_Python实现HMM(隐马尔可夫模型)
  6. OpenShift 4 - DevSecOps Workshop (8) - 为Pipeline增加生成Image任务
  7. 如何在局域网上托管ASP.NET Web应用程序
  8. 在IIS上部署ASP.NET Core Web API
  9. VS Code 的 python 扩展发布,绘图功能更强大
  10. python中unexpectedtoken怎么解决_linux后台执行./run.py提示python syntax error near unexpected token `('...