因此,我正在探索WebGPU,并认为这将是一个有趣的练习,在其中实现一个基本的神经网络。对GPU着色器编程和神经网络的了解很少,而且我对WebGPU(w3.org/TR/webgpu和w3.org/TR/WGSL)的唯一参考是高度技术性的,这使它变得非常有趣。
不管怎么说,我在某种程度上搞混了,我实际上可以在小型网络上正确地执行前馈和反向传播,与我的js cpu实现相比,它的速度也非常快,尽管我确信我严重地没有充分利用硬件。
我已经到了一个阶段,我想尝试更大的网络,但当涉及到工作组和同步执行时,我有点不知所措。为了保持简单,我将把问题集中在前馈操作上:
目前,我正精确地分配对应于神经网络中最宽层的线程数。其思想是,每个线程计算当前层中单个神经元的值,然后碰到一个屏障,然后每个线程一起移动到下一个层,继续。
问题是,我只有两种设置障碍的方法-- workgroupBarrier()或结束执行,并为下一层分配一堆新的线程。
第一个问题是,它只能在工作组内工作,而且我只能在性能开始受影响之前使工作组变得如此庞大,因为据我所知,由于需要共享内存,只有一个CU可以在工作组上工作。如果我制作我的工作组256x256,那么它会被切割成块,当剩下的硬件处于空闲状态时,单个CU将不得不咀嚼。这就限制了我可以用一个CU能容纳多少个线程来限制我的网络,非常糟糕。
第二个问题很明显--一个单独的调度只是缓慢的,比我测试中的一个障碍慢得多。
现在,我根本没有使用工作组共享内存,我想要做的就是分派任意数量的线程,并设置全局屏障。据我所知,WebGPU没有全球障碍.除了storageBarrier?
即使在阅读了w3.org上关于它是什么的两个句子之后,我仍然不知道它是什么,但我认为这与内存访问同步有关,而不是一个全局障碍。我确实测试了它,结果是正确的,但是即使我从代码中删除了所有的障碍,结果也是正确的,我猜GPU的SIMT执行风格的好处。然而,我不需要它是“可能正确的”,我需要保证正确,所以我需要一个全球障碍。是storageBarrier吗?如果没有,那又是什么呢?
额外的问题--为什么工作组和调度有三个维度,为什么不只有一个?
发布于 2022-07-20 14:30:11
好问题。
先简单一点:
奖金问题--为什么工作组和调度有三个维度,为什么不只有一个?
这正是GPU内部结构的方式。计算着色器发展后,直图形渲染。2D调度与二维图像处理(如卷积)很好地对应,图形渲染也具有三维纹理。
障碍可以帮助您协调读写内存的访问.问题是:您正在协调哪些代理(调用),以及控制访问的是什么内存。
障碍跨越两个维度进行协调:
不同invocations.
调用按层次分组:
。
地址空间:
有鉴于此,我们现在可以说:
详细地说,一种合理的思考方法是,地址空间X (X是“工作组”或“存储”)的一个障碍是执行中的一个点:
工作组中的所有调用都在等待对方到达屏障,所有在飞行中写入地址空间'X‘complete
(这不是规范中描述的方式,因为它的约束过大。但这是给语言律师的。)
您会注意到:您只能在同一个工作组中协调跨调用。这意味着,对于非原子操作,没有支持的方法可以做到这一点:
workgroup
中
为什么?金属阴影语言障碍不支持它。抱歉的。有关详细信息,请参阅https://github.com/gpuweb/gpuweb/pull/2297
(如果您想继续讨论内存模型定义和测试,这种模式称为“消息传递”模式。)
注意:在GPU语言规范中,"CU“或”计算单元“不是一个定义良好的术语。这是如何组织和销售特定的GPU,但这是一个细节。
好的,关于如何构造工作组。如果数据的形状与工作组的形状相同,这是很容易的。但否则你必须阻止你的数据。对问题进行分区以适应,或者使单个调用一次执行一个数据块。这是最大化利用率和并行性的关键。关于如何做到这一点,有很多文献/教程,特别是关于矩阵乘法之类的东西。
https://stackoverflow.com/questions/72035548
复制相似问题