c语言 gpu加速,python代码用gpu运行
欢迎来到腾讯云社区获取更多腾讯海量技术实践晾衣架~
什么是基于Javascript的GPU加速?
由于CPU和GPU的设计目标不同,内部结构也大相径庭。CPU需要支持常见场景,内部结构非常复杂。GPU通常用于计算统一和不相关的数据类型。因此,在Web上实现3D场景时,我们通常使用WebGL来利用GPU操作(大量顶点)。但是如果只是一般的计算场景呢?比如在处理一幅图像的大量像素信息时,有没有利用GPU资源的方法?这就是本文要阐述的,GPU通用计算,简称GPGPU。
2.示例演示:颜色代码识别
如下图所示,我们识别照片中的彩虹糖果块,并给糖果添加表情。
2.1实例地址(打开页面,依次点击“按CPU计算”和“按GPU计算”按钮)。) ) ) ) )。
2.2执行代码
varRGB2HSV=function(r,g,b ) {
varmax=math.max(r,g,b),min=Math.min(r ) r,g,b),
d=最大-最小,
h、
s=(max===0?0 : d/max),
v=max/255;
开关(最大){
case min:h=0;黑色;
caser:h=(g-b ) d* ) gb?6: 0;h/=6 * d;黑色;
caseg:h=(B-R)d * 2;h/=6 * d;黑色;
情况b:h=(r-g)d * 4;h/=6 * d;黑色;
}
返回{
h:自我色调指数[ parseint (h * 360 ) ],
s: s,
五:五
}
(;
处决人数:262,144人
2.3测试结论
在这个例子中,GPU和CPU用于色调转换(以便光线不影响识别精度),其他步骤相同。
2.4使用gp GPU的意义
因为GPU和CPU之间的数据传输过程相当于GPU的实际运算时间,使用GPU的运算传输成本太高,实测在Android上有很大优势。
这个测试用例提取自webAR项目,它需要实时跟踪用户摄像头处理的视频流(256*256)。使用GPU进行计算意义重大。如果不这样做,就无法实现实时跟踪。
3.如何实现GPU通用计算?
3.1首先通过流程图展示原理。
3.2实施
3.2.1只需创建顶点着色器并传递贴图坐标。
Attributec4位置;
改变vec2 vCoordvoid main () }
vCoord=position.xy * 0.5 0.5
gl _ Position=position
}
3.2.2创建一个面片着色器,根据贴图坐标进行贴图。
精密高精度浮点运算;
改变vec2 vCoord
示例2d地图;voidmain(void ) {
VEC4color=texture2d(map,vCoord);
gl _ FragColor=color
}
3.3.3根据上面的着色器代码创建一个程序对象。变量代码就是我们要传递的计算代码。
//着色器程序var vertexShaderSource= . ;
varfragmentshadersource=“.”代码“.”;
varvertexshader=GL . create shader(GL . vertex _ shader;
GL.shadersource(vertexshader,vertexShaderSource);
GL . compile shader(vertex shader;
varfragmentshader=GL . create shader(GL . fragment _ shader);
GL.shadersource(fragmentshader,fragmentShaderSource);
GL.compile着色器(片段着色器;
//创建一个程序对象
var program=gl.createProgr
am();
gl.attachShader(程序,顶点着色器);
gl.attachShader(program,fragment shader);
gl.linkProgram(程序);
gl.useProgram(程序);
3.3.4传入顶点数据,创建一个面覆盖整个画布。
//顶点数据传输
var vertices=new float 32 array([-1.0,1.0,-1.0,-1.0,1.0,-1.0,1.0,1.0]);
var vertex buffer=GL . create buffer();
bindBuffer(gl。ARRAY_BUFFER,vertex BUFFER);
gl.bufferData(gl。数组缓冲区,顶点,gl。STATIC _ DRAW);
var a position=GL . getattributelocation(program, position );
gl . vertexattributepointer(a position,2,GL。FLOAT,false,0,0);
GL . enablevertexattribarray(a position);
3.3.5输入原始数据,在这种情况下,我要处理的图像数据,作为地图,最终绘制到屏幕上。
var gl=this.gl
var program=this.program
var texture=GL . create texture();
var uMap=GL . getuniformlocation(program, map );
activeTexture(gl。texture 0);
bindTexture(gl。纹理_2D,纹理);
gl.texImage2D(gl。纹理_2D,0,gl。RGBA冰川。RGBA冰川。UNSIGNED_BYTE,canvas);
gl.texParameteri(gl。纹理_2D,德国。纹理_放大_过滤,gl。最近);
gl.texParameteri(gl。纹理_2D,德国。纹理最小过滤器。最近);
gl.texParameteri(gl。纹理_2D,德国。纹理_包裹_S,gl。CLAMP _ TO _ EDGE);
gl.texParameteri(gl。纹理_2D,德国。TEXTURE_WRAP_T,gl。CLAMP _ TO _ EDGE);
gl.generateMipmap(gl。质感_ 2D);
gl.uniform1i(uMap,0);
//绘制
gl.clearColor(0,0,0,1);
gl.clear(gl。颜色_缓冲区_位);
gl.drawArrays(gl。三角形_FAN,0,4);
3.3.6从最终绘制的图片中获取颜色信息作为最终处理结果数据。
var pixels=new uint 8 array(GL . drawingbufferwidth * GL . drawingbufferheight * 4);
gl.readPixels(0,0,gl.drawingBufferWidth,gl.drawingBufferHeight,gl。RGBA冰川。无符号_字节,像素);
其实原理明确之后,整体实现起来还是比较简单的。但是对于不了解WebGL的同学来说,很难理解。我准备写一系列的WebGL教程,有兴趣的同学可以关注一下。
4.有现成的类库吗?
可以看到,在我实现的gpu.js中,javascript并没有被转换成着色器语言(C类),而是用户直接传入着色器代码。不过github上已经有一个把javascript转换成shader语言的库了。https://github.com/gpujs/gpu.js
为什么我没有直接用?
使用简单,2k就能实现的代码,不想引入200k库;
数据输入输出可以自己灵活控制;
shader的语言非常简单,尤其是只使用基本运算逻辑的代码,不需要通过库从Javascript转换而来。
欢迎来到腾讯QcloudCommunity或关注贾云社区微信微信官方账号,第一时间获取更多海量技术实践干货~
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。