减少GPU和CPU之间的带宽(发送原始数据或预先计算)

时间:2012-05-08 17:02:55

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

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

粒子系统。

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

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

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

2 个答案:

答案 0 :(得分:3)

  

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

     

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

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

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

无论如何,对我而言,听起来你不需要优化任何东西,并且没有实际需要进行优化。因此,最好的想法是专注于其他一些事情。

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

答案 1 :(得分:2)

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

  1. 您确定通过总线传输的数据量是否足以成为问题?您可能希望进行数学计算,看看每秒有多少数据与目标硬件上可用的数据相比。
  2. 应用程序是否可能受CPU限制或受GPU限制?如果它已经受到GPU限制,则无需进一步加载它。
  3. 粒子系统很容易在CPU上实现,并且可以在任何硬件上运行。支持非平凡粒子系统的GPU实现将更加复杂,并且仅限于支持所需功能的硬件(例如,流出和允许访问它的API。)
  4. 考虑一种混合方法。你能否将粒子系统分解为GPU上实现的低复杂度,高带宽粒子系统以及CPU上实现的高复杂度,低带宽系统?
  5. 所有这一切,我想我会从CPU实现开始,如果证明有必要和可行的话,将部分工作转移到GPU上。