Deep learning 用于深度学习的GPU着色器

Deep learning 用于深度学习的GPU着色器,deep-learning,gpu,Deep Learning,Gpu,着色器如何用于深度学习?根据我在网上的研究,似乎着色器只用于在计算机图形学中绘制阴影。关键的见解是传统的GPU将像素写入2D像素阵列。什么是像素?它们只是价值观。所以实际上,GPU会将您要求它使用着色器计算的值写入2D值数组。停止将这些值视为像素,开始将它们视为数学方程的结果,您可以使用GPU快速计算某些类型的数学 传统上,GPU通过纹理访问2D值数组。使用输入数据填充1个或多个纹理。这些数据可以是1D、2D或3D,当然,您可以使用更多的数学知识将更大维度数据的索引转换回这些1D、2D或3D纹理

着色器如何用于深度学习?根据我在网上的研究,似乎着色器只用于在计算机图形学中绘制阴影。

关键的见解是传统的GPU将像素写入2D像素阵列。什么是像素?它们只是价值观。所以实际上,GPU会将您要求它使用着色器计算的值写入2D值数组。停止将这些值视为像素,开始将它们视为数学方程的结果,您可以使用GPU快速计算某些类型的数学

传统上,GPU通过纹理访问2D值数组。使用输入数据填充1个或多个纹理。这些数据可以是1D、2D或3D,当然,您可以使用更多的数学知识将更大维度数据的索引转换回这些1D、2D或3D纹理中的任何一种

事实上,最初GPU这样做是为了使用像素绘制三角形,这可以说是历史的偶然。像素只是二维数组中的值。人们只是花了一段时间才不再把它们看作仅仅是像素

举个例子,让我们使用GPU和WebGL添加2个数字数组

const gl=document.createElement('canvas').getContext('webgl');
常量ext=gl.getExtension('OES_纹理_浮动');
如果(!ext)警报('需要OES_纹理_浮动');
//数据
const a=新的Float32Array([12,34,56,78,90]);
const b=新的Float32Array([11,22,33,44,55]);
常数=a.长度;
常数vs=`
void main(){
gl_位置=vec4(0,0,0,1);
gl_PointSize=float(${numElements});
}`;
常数fs=`
高精度浮点;
均匀采样;
均匀取样器2d-bTex;
void main(){
vec4 a=texture2D(aTex,gl_PointCoord.xy);//从数组a获取值
vec4 b=texture2D(bTex,gl_PointCoord.xy);//从数组b获取值
gl_FragColor=a+b;//写入结果
}`;
//编译着色器以进行计算
const programInfo=twgl.createProgramInfo(gl[vs,fs]);
//创建5x1 RGBA纹理以存储结果
常量fbi=twgl.createFramebufferInfo(gl[
{type:gl.FLOAT,minMag:gl.NEAREST,wrap:gl.CLAMP_TO_EDGE,},
],Numements,1);
twgl.bindFramebufferInfo(德国劳埃德船级社,联邦调查局);
//将数据复制到纹理
const aTex=twgl.createTexture(gl{
src:a,
宽度:Numelents,
格式:gl.亮度,
minMag:gl,
});
常量bTex=twgl.createTexture(gl{
src:b,
宽度:Numelents,
格式:gl.亮度,
minMag:gl,
});
//告诉GPU使用此着色器
总账使用程序(programInfo.program);
//绑定纹理并告诉着色器在哪里可以找到它们
twgl.设置制服(程序信息{
aTex,
bTex,
});
//绘制数值大小像素点,这将导致
//正在计算的数值
总图绘制阵列(总图点,0,1);
//阅读结果(是RGBA,但我们只关心R)
const result=新的Float32Array(numElements*4);
gl.readPixels(0,0,numElements,1,gl.RGBA,gl.FLOAT,result);
for(设i=0;i

关键洞察是传统的GPU将像素写入2D像素阵列。什么是像素?它们只是价值观。所以实际上,GPU会将您要求它使用着色器计算的值写入2D值数组。停止将这些值视为像素,开始将它们视为数学方程的结果,您可以使用GPU快速计算某些类型的数学

传统上,GPU通过纹理访问2D值数组。使用输入数据填充1个或多个纹理。这些数据可以是1D、2D或3D,当然,您可以使用更多的数学知识将更大维度数据的索引转换回这些1D、2D或3D纹理中的任何一种

事实上,最初GPU这样做是为了使用像素绘制三角形,这可以说是历史的偶然。像素只是二维数组中的值。人们只是花了一段时间才不再把它们看作仅仅是像素

举个例子,让我们使用GPU和WebGL添加2个数字数组

const gl=document.createElement('canvas').getContext('webgl');
常量ext=gl.getExtension('OES_纹理_浮动');
如果(!ext)警报('需要OES_纹理_浮动');
//数据
const a=新的Float32Array([12,34,56,78,90]);
const b=新的Float32Array([11,22,33,44,55]);
常数=a.长度;
常数vs=`
void main(){
gl_位置=vec4(0,0,0,1);
gl_PointSize=float(${numElements});
}`;
常数fs=`
高精度浮点;
均匀采样;
均匀取样器2d-bTex;
void main(){
vec4 a=texture2D(aTex,gl_PointCoord.xy);//从数组a获取值
vec4 b=texture2D(bTex,gl_PointCoord.xy);//从数组b获取值
gl_FragColor=a+b;//写入结果
}`;
//编译着色器以进行计算
const programInfo=twgl.createProgramInfo(gl[vs,fs]);
//创建5x1 RGBA纹理以存储结果
常量fbi=twgl.createFramebufferInfo(gl[
{type:gl.FLOAT,minMag:gl.NEAREST,wrap:gl.CLAMP_TO_EDGE,},
],Numements,1);
twgl.bindFramebufferInfo(德国劳埃德船级社,联邦调查局);
//将数据复制到纹理
const aTex=twgl.createTexture(gl{
src:a,
宽度:Numelents,
格式:gl.亮度,
minMag:gl,
});
常量bTex=twgl.createTexture(gl{
src:b,
宽度:Numelents,
格式:gl.亮度,
minMag:gl,
});
//告诉GPU使用此着色器
总账使用程序(programInfo.program);
//绑定纹理并告诉着色器在哪里可以找到它们
twgl.设置制服(程序信息{
aTex,
bTex,
});
//绘制数值大小像素点,这将导致
//正在计算的数值
总图绘制阵列(总图点,0,1);
//阅读结果(是RGBA,但我们只关心R)
const result=新的Float32Array(numElements*4);
gl.readPixels(0,0,numElements,1,gl.RGBA,gl.FLOAT,result);
for(设i=0;i

感谢您提醒我注意这一点。我已经修改过了!谢谢你,布林