4

我正在创建类似于 CUDA 的东西,但我看到将内存从 RAM 复制到 VRAM 非常快,就像从 RAM 复制到自身一样快。但是从 VRAM 复制到 RAM 比从 RAM 到 VRAM 慢。

顺便说一句,我glTexSubImage2D用来从 RAM 复制到 VRAM 以及glGetTexImage从 VRAM 复制到 RAM。

为什么?有没有办法提高它的性能,比如将 RAM 复制到 VRAM?

4

2 回答 2

6

将数据从 GPU 传输到 CPU 始终是一个非常缓慢的操作。

GPU -> CPU回读引入了一个“同步点”,CPU 必须等待 GPU 完成其计算。在此期间,CPU 停止向 GPU 提供数据,导致其停止。

现在,请记住,现代 GPU 是以高度并行的方式设计的,在任何给定时刻都有数千个线程在运行。同步点必须等待所有这些线程完成处理,然后才能回读它们的计算结果。回读完成后,所有这些线程必须从零开始重新执行……糟糕!

异步读回结果(几帧后),允许 GPU 继续执行而不会导致其线程饥饿(上面概述的停止和恢复问题)。这极大地提高了性能 - GPU 的并行度越高,性能提升就越高。

根据您的图形芯片和驱动程序,使用PBO可能会获得更好的性能。

于 2012-11-30T13:52:37.953 回答
3

顺便说一句,我使用 glTexSubImage2D 从 RAM 复制到 VRAM 和 glGetTexImage 从 VRAM 复制到 RAM。

那么你不是在复制数据。您正在执行像素传输操作,这可能需要 CPU 修改,具体取决于图像的内部格式、像素传输格式和像素传输类型参数。

由于您没有提供实际代码,因此无法知道您是否选择了错误的参数。

如果要测试直接复制性能,请使用缓冲区对象

于 2012-11-30T15:12:37.320 回答