【问题标题】:Reducing bandwidth between GPU and CPU( sending raw data or pre calculate first)减少 GPU 和 CPU 之间的带宽(先发送原始数据或预计算)
【发布时间】:2012-05-17 04:47:50
【问题描述】:

好的,所以我只是想找出减少 GPU 和 CPU 之间带宽的最佳方法。

粒子系统。

我是否应该预先计算 CPU 上的大部分内容并将其发送到 GPU,这包括位置、旋转、速度、alpha 计算和随机数等内容。

或者我应该在着色器中尽可能多地使用几何着色器。

我的问题是,我编写的那种应用程序必须有一些很好的变量发送到着色器,例如,用户在运行时将选择发射器位置和速度以及更多。我不确定如何处理的事情是“如果用户想要一个随机速度并给出一个最小值和最大值来选择随机值,这个随机值是否应该在 CPU 上计算并发送作为 GPU 的单个值,还是应该将最小值和最大值都发送到 GPU 并在 GPU 中使用随机函数生成器来执行此操作?非常感谢任何有关减少带宽和优化的 cmets。

【问题讨论】:

    标签: c++ gpu bandwidth data-transfer shader


    【解决方案1】:

    我是否应该预先计算 CPU 上的大部分内容并将其发送到 GPU,这包括位置、旋转、速度、alpha 计算和随机数等内容。

    或者我应该在着色器中尽可能多地使用几何着色器。

    无法回答。花费过多的 CPU 时间,性能会下降。花费过多的 GPU 时间,性能也会下降。传输太多数据,性能会下降。所以,不要试图猜测(我不知道你在写什么应用程序,你的目标硬件是什么等等。地狱,你甚至没有指定你的目标 api 和平台)测量/配置文件并选择最佳方法。 PROFILE 而不是试图猜测性能。为此有 AQTime 7 Standard、gprof 和 NVPerfKit(以及许多其他工具)。

    您的应用程序中确实存在性能问题吗?如果您没有任何性能问题,则不要执行任何操作。你有,比如说每帧一千万个粒子吗?如果没有,也没什么理由担心,因为 7 年前 600mhz cpu 能够轻松处理数千个。另一方面,如果你有动态 3d 环境,并且粒子必须与之交互(反弹),那么在 GPU 上完成这一切将会更加困难。

    无论如何,对我来说,听起来您不需要优化任何东西,也没有实际需要优化。所以最好的办法是专注于其他一些事情。

    但是,无论如何,请确保您使用正确的方式来传输经常更新的“动态”数据。在 directX 中,这意味着使用带有 D3DLOCK_DISCARD|D3DLOCK_NOOVERWRITE 的动态只写顶点缓冲区。对于 OpenGL,这可能意味着使用 STREAM or DYNAMIC bufferdata with DRAW access。这应该足以避免重大的性能损失。

    【讨论】:

    • 我确实有性能问题,顺便说一下,我正在使用 directX。我写了一个粒子系统编辑器,基本上我可以创建和存储尽可能多的粒子系统但是,假设我有 20 个粒子系统,每个系统有 1000 个粒子,即 20000 个粒子。这是我开始注意到速度相当慢的地方,帧时间可能会从 120 下降到 40,具体取决于我在场景中的位置。
    • @RobBain85:您需要为粒子系统使用动态顶点缓冲区,并使用 NVPerfKit/NVPerfHud 对整个事物进行分析,以查看瓶颈在图形端的位置,并使用 cpu 配置文件对其进行分析,以查看瓶颈在哪里CPU端。如果无法消除瓶颈,您要么需要算法优化,要么必须为粒子系统实施 LOD 减少。像这样的问题也应该作为单独的问题提出 - 这不是一个论坛。
    【解决方案2】:

    对此没有唯一的正确答案。以下是一些可能有助于您下定决心的事情:

    1. 您确定通过总线的数据量高到足以成为问题吗?您可能需要进行数学计算,看看每秒有多少数据与目标硬件上可用的数据。
    2. 应用程序是否可能受 CPU 限制或 GPU 限制?如果它已经受 GPU 限制,则没有必要进一步加载它。
    3. 粒子系统很容易在 CPU 上实现,并且可以在任何硬件上运行。支持非平凡粒子系统的 GPU 实现将更加复杂,并且仅限于支持所需功能的硬件(例如流输出和提供访问权限的 API。)
    4. 考虑一种混合方法。您能否将粒子系统分为在 GPU 上实现的低复杂度、高带宽粒子系统和在 CPU 上实现的高复杂度、低带宽系统?

    说了这么多,我想我会从一个 CPU 实现开始,如果证明有必要和可行的话,我会将一些工作转移到 GPU 上。

    【讨论】:

    • 感谢您的回复,我认为这可能是最好的选择,我应该让用户决定使用什么 CPU 或 GPU。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2014-05-26
    相关资源
    最近更新 更多