如何在WebGL中命中texel缓存?

如何在WebGL中命中texel缓存?,webgl,gpu,gpgpu,Webgl,Gpu,Gpgpu,我正在做的是WebGL上的GPGPU,我不知道我要说的访问模式适用于一般的图形和游戏程序。在我们的代码中,经常会遇到需要按输出texel汇总或减少的数据。一个非常简单的例子是矩阵乘法,在此过程中,对于每个输出texel,返回一个值,该值是一个输入的行和另一个输入的列的点积 这一直是我们性能的症结所在,因为与其说是计算,不如说是成倍的数据访问。因此,我一直在尝试寻找一种读取模式或数据布局模式,以加快此操作,但我完全没有成功 我将在下面描述一些假设和一些方案。下面是所有这些的示例代码 不幸的是,由于

我正在做的是WebGL上的GPGPU,我不知道我要说的访问模式适用于一般的图形和游戏程序。在我们的代码中,经常会遇到需要按输出texel汇总或减少的数据。一个非常简单的例子是矩阵乘法,在此过程中,对于每个输出texel,返回一个值,该值是一个输入的行和另一个输入的列的点积

这一直是我们性能的症结所在,因为与其说是计算,不如说是成倍的数据访问。因此,我一直在尝试寻找一种读取模式或数据布局模式,以加快此操作,但我完全没有成功

我将在下面描述一些假设和一些方案。下面是所有这些的示例代码 不幸的是,由于大小原因,我无法使用StackOverflow的“snippet”功能。注意:所有示例都是编写到控制台,而不是html页面

  • 基本matmul实现:示例:[2,3]x[3,4]->[2,4]。这将以简化的形式生成(w:3,h:2)和(w:4,h:3)的两种纹理。对于每个输出纹理,我将沿左纹理的X轴读取,但沿右纹理的Y轴读取。(参见webgl matmul.html)

  • 假设GPU访问的数据与CPU类似——即逐块访问——如果我沿着纹理的宽度读取,我应该经常访问缓存。 为此,我将两个纹理的布局方式,我将做相应行(沿纹理宽度)的点积。示例:[2,3]x[4,3]->[2,4]。请注意,右纹理的数据现在进行了转置,因此对于每个输出texel,我将执行左一行和右一行的点积。(参见webgl matmul shared alongX.html)

  • 为了确保上述假设确实有效,我还创建了一个否定测试。在这个测试中,我将沿着Y轴读取左右纹理,这应该是有史以来性能最差的。数据被预先转置,以便结果有意义。示例:[3,2]x[3,4]->[2,4]。(参见webgl matmul shared alongY.html)

  • 所以我运行了这些——我希望你们也能看到——我没有发现任何证据支持这种缓存行为的存在或不存在。您需要将每个示例运行几次,以获得一致的结果进行比较

    然后我写了一篇论文,简言之,它声称GPU以块(或者我称之为分片)的形式缓存数据

    基于这一有前途的线索,我创建了一个版本的matmul(或点积),它使用2x2的块进行计算。当然,在使用之前,我必须将输入重新安排到这样的布局中。我的比较中没有包括重新安排的费用。假设我可以做一次,然后运行我的matmul多次。即使是这个方案,如果不拿走一些东西,也不会对性能产生任何影响。(请参见webgl dotprod tiled.html)

    A关于这一点,我完全没有想法,任何提示都将不胜感激。 谢谢