为什么将内存从VRAM复制到RAM比RAM更慢到VRAM? (OpenGL的)

时间:2012-11-30 13:40:12

标签: c++ opengl gpgpu

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

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

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

2 个答案:

答案 0 :(得分:6)

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

  

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

     

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

     

异步读回结果(在几帧之后),允许GPU继续执行而不会使其线程挨饿(上面列出的停止和恢复问题)。这极大地提高了性能 - GPU越平行,性能提升越高。

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

答案 1 :(得分:3)

  

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

然后你不是复制数据。您正在执行pixel transfer operations,这可能需要修改CPU,具体取决于您的image's internal format,像素传输格式和像素传输类型参数。

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

如果您想测试直接复制效果,请使用buffer object