深度学习中如何使用着色器?根据我在网上进行的研究,似乎着色器仅用于在计算机图形学中绘制阴影。
答案 0 :(得分:2)
关键见解是传统上GPU将像素写入2D像素阵列。什么是像素?它们只是价值。因此,实际上,GPU将您要求它使用着色器进行计算的值写入2D值数组。不再将这些值视为像素,而开始将它们视为数学方程式的结果,您就可以使用GPU来快速计算某些种类的数学。
传统上,GPU通过纹理访问2D值数组。使用输入数据填充1个或多个纹理。这些数据可以是1D,2D或3D,或者您当然可以使用更多的数学方法将较大尺寸数据的索引转换回那些1D,2D或3D纹理中的任何一个
最初GPU使用像素绘制三角形的事实可以说是历史的偶然。像素只是二维数组中的值。人们花了一段时间才停止将它们视为像素。
一个示例,让我们使用基于WebGL的GPU添加2个数字数组
const gl = document.createElement('canvas').getContext('webgl');
const ext = gl.getExtension('OES_texture_float');
if (!ext) alert('need OES_texture_float');
// the data
const a = new Float32Array([12, 34, 56, 78, 90]);
const b = new Float32Array([11, 22, 33, 44, 55]);
const numElements = a.length;
const vs = `
void main() {
gl_Position = vec4(0,0,0,1);
gl_PointSize = float(${numElements});
}`;
const fs = `
precision highp float;
uniform sampler2D aTex;
uniform sampler2D bTex;
void main() {
vec4 a = texture2D(aTex, gl_PointCoord.xy); // get value from array a
vec4 b = texture2D(bTex, gl_PointCoord.xy); // get value from array b
gl_FragColor = a + b; // write the result
}`;
// compile the shaders to do the math
const programInfo = twgl.createProgramInfo(gl, [vs, fs]);
// create a 5x1 RGBA texture to store the results
const fbi = twgl.createFramebufferInfo(gl, [
{ type: gl.FLOAT, minMag: gl.NEAREST, wrap: gl.CLAMP_TO_EDGE, },
], numElements, 1);
twgl.bindFramebufferInfo(gl, fbi);
// copy the data to textures
const aTex = twgl.createTexture(gl, {
src: a,
width: numElements,
format: gl.LUMINANCE,
minMag: gl.NEAREST,
});
const bTex = twgl.createTexture(gl, {
src: b,
width: numElements,
format: gl.LUMINANCE,
minMag: gl.NEAREST,
});
// tell the GPU to use this shader
gl.useProgram(programInfo.program);
// bind the texture and tell the shader where to find them
twgl.setUniforms(programInfo, {
aTex,
bTex,
});
// draw numElements size pixel point which will result in
// numElement values being computed
gl.drawArrays(gl.POINTS, 0, 1);
// read the result (it's RGBA but we only care about R)
const result = new Float32Array(numElements * 4);
gl.readPixels(0, 0, numElements, 1, gl.RGBA, gl.FLOAT, result);
for (let i = 0; i < numElements; ++i) {
console.log(`${a[i]} + ${b[i]} = ${result[i * 4]}`);
}
<script src="https://twgljs.org/dist/4.x/twgl.min.js"></script>
您可以看到GPU刚刚添加了2个数据数组。数组的添加和乘法几乎是机器学习的核心。
tensorflow can use WebGL in the browser。
如果您想学习WebGL,请考虑these tutorials。他们没有做很多非图形方面的工作,但希望能解释GPU的工作原理。无论使用什么API(WebGL / DirectX / OpenGL / Vulkan / Metal),知识都几乎相同