我应该更喜欢在 CPU 还是 GPU 上计算矩阵?
假设我有以下矩阵P * V * M
,我应该在 CPU 上计算它们以便我可以将最终矩阵发送到 GPU (GLSL) 还是应该将这三个矩阵分别发送到 GPU 以便 GLSL 可以计算最终矩阵?
我的意思是在这种情况下,GLSL 必须为每个顶点计算 MVP 矩阵,因此在 CPU 上预先计算它可能会更快。
但是假设GLSL只需计算一次MVP矩阵,GPU计算最终矩阵会比CPU更快吗?
我应该更喜欢在 CPU 还是 GPU 上计算矩阵?
假设我有以下矩阵P * V * M
,我应该在 CPU 上计算它们以便我可以将最终矩阵发送到 GPU (GLSL) 还是应该将这三个矩阵分别发送到 GPU 以便 GLSL 可以计算最终矩阵?
我的意思是在这种情况下,GLSL 必须为每个顶点计算 MVP 矩阵,因此在 CPU 上预先计算它可能会更快。
但是假设GLSL只需计算一次MVP矩阵,GPU计算最终矩阵会比CPU更快吗?
一般规则:如果您可以将其以uniform的形式传递给着色器,请始终在 CPU 上进行预先计算;没有例外。着色器端的计算仅对顶点和片段之间变化的值有意义。整批顶点中所有不变的东西都在 CPU 上得到最有效的处理。
GPU 并不是神奇的“可以做任何事情都更快”的机器。在某些任务中,CPU 可以轻松胜过 GPU,即使对于非常大的数据集也是如此。所以一个非常简单的指导方针是:如果你可以将它移到 CPU 上,而不需要花费比 GPU 处理它的总开销更多的 CPU 时间来进行计算,那么就在 CPU 上进行。单个矩阵的计算属于这些任务。
像大多数使用 OpenGL 的情况一样,这取决于。
在大多数情况下,单个计算在 CPU 上比在 GPU 上完成得更快。GPU 的优势在于它可以并行执行大量计算。
另一方面,这也取决于你的瓶颈在哪里。如果您的 CPU 正在做许多其他工作,但您的着色器在最低功率的目标系统上还不是瓶颈,那么您可以通过将一些矩阵乘法移动到顶点着色器来轻松地看到一些性能改进。
通常,您应该避免在片段着色器中进行任何也可以在顶点着色器或 CPU 上完成的工作,但除此之外,这取决于具体情况。除非您遇到性能问题,否则请以最简单的方式进行操作,如果您遇到性能问题,请同时使用两种方式并分析性能以查看哪种方式效果更好。