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

标签 c++ gpu bandwidth data-transfer shader

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

粒子系统。

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

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

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

最佳答案

Should I be pre calculating most things on the CPU and sending it to the GPU this is includes stuff like positions, rotations, velocity, calculations for alpha and random numbers ect.

Or should I be doing as much as i can in the shaders and using the geometry shader as much as possible.

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

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

无论如何,对我来说,听起来你不需要优化任何东西,也没有实际需要优化。因此最好的想法是专注于其他事情。

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

关于c++ - 减少GPU和CPU之间的带宽(发送原始数据或先预计算),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10503071/

相关文章:

c++ - 在 Boost Spirit 中定义使用子解析器参数化的解析器

cuda - 如何释放 device_vector<int>

bandwidth - tc netem 中的选项限制是什么意思和做什么?

cuda - 用CUDA求解线性系统AX = B

matrix - CUDA 添加矩阵的行

iphone - 如何在 iPhone 上测试低带宽条件

performance - 什么是带宽需求?

c++ - Qt "Form Load"函数

c++ - 编译器会根据我处理未引用参数的方式执行不同的操作吗?

c++ - 模板化类中带有模板对象的结构