我应该在GPU或CPU上计算矩阵吗?

Mai*_*ein 40 opengl glsl computer-vision

我是否更愿意在CPU或GPU上计算矩阵?

假设我有以下矩阵P * V * M,我应该在CPU上计算它们以便我可以将最终矩阵发送到GPU(GLSL),还是应该将这三个矩阵分别发送到GPU以便GLSL可以计算最终矩阵?

我的意思是在这种情况下,GLSL必须为每个顶点计算MVP矩阵,因此在CPU上预先计算它可能更快.

但是,让我们说GLSL只需要计算一次MVP矩阵,GPU会比CPU更快地计算出最终矩阵吗?

dat*_*olf 62

一般规则:如果您可以将其以统一的形式传递给着色器,则始终在CPU上预先计算; 没有例外.着色器侧的计算仅对顶点和片段之间的值有所不同.在整批顶点中不变的所有东西都可以在CPU上得到最有效的处理.

GPU不是神奇的"可以做更快的一切"机器.在某些任务中,CPU可以轻松胜过GPU,即使对于非常大的数据集也是如此.因此,一个非常简单的指导原则是:如果您可以将其移动到CPU而不花费更多的CPU时间进行计算,而不是GPU处理总开销所需的时间,那么就在CPU上执行.单个矩阵的计算是这些任务之一.

  • 对于"令人尴尬"并行的问题,GPU通常更快. (7认同)
  • @Calmarius:是的,你可以并行化矩阵计算,实际上大多数CPU都会使用它们的向量指令集并行化它.但是矩阵需要精确计算*一次*并且对于使用该特定变换的模型的所有顶点保持相同.仅仅用于使GPU执行4×4矩阵乘法的开销比在CPU上进行该计算需要更多的指令(​​和时间).如果你想并行化2k×2k矩阵乘法,那么GPU将很好地并行化.但对于4×4矩阵,开销根本不值得. (5认同)
  • 矩阵乘法不是平行的吗?每个元素都可以独立计算. (4认同)
  • 它并不总是关于GPU的速度和并行性.您需要记住,顶点着色器中的每个顶点都会出现矩阵乘法!如果你有一个有数千个顶点的复杂网格,你猜怎么着?您将乘以P x V x M数千次,一遍又一遍地计算相同的精确MVP矩阵值.这很浪费. (4认同)

bcr*_*ist 14

像大多数使用OpenGL的情况一样,这取决于.

在大多数情况下,单个计算可以在CPU上比在GPU上更快地完成.GPU的优势在于它可以并行进行大量计算.

另一方面,它还取决于您的瓶颈所在.如果你的CPU正在做很多其他的工作,但你的着色器不是最低功率目标系统的瓶颈,那么你可以通过将一些矩阵乘法移动到顶点着色器来轻松地看到一些性能改进.

通常,您应该避免碎片着色器中的任何工作也可以在顶点着色器或CPU中完成,但除此之外,它取决于具体情况.除非您遇到性能问题,否则只需按照最简单的方式执行操作,如果遇到性能问题,请同时执行此操作并分析性能以查看哪些更有效.

  • 使GPU计算的整个开销比简单的矩阵 - 矩阵计算需要更多的周期.您可以在现代CPU的16条指令中进行4×4·4×4计算.这比选择着色器程序所需的要少得多,设置制服并通过发送原始图像来渲染GPU的齿轮.使GPU实际执行某些操作的开销非常高,因此您尝试将尽可能大的作业批量处理到GPU. (8认同)
  • @datenwolf不,不是,但它也不是免费的.因此,如果程序没有图形要求,但是其他部分计算要求很高,那么让GPU计算一些冗余的MVP矩阵就可以了.正如我所说,这一切都取决于具体情况. (7认同)
  • 计算一大堆矩阵,特别是MVP矩阵,永远不会成为CPU的瓶颈. (5认同)