我正在创建类似于CUDA的东西,但我看到从RAM到VRAM的内存复制速度非常快,就像从RAM复制到自身一样。但是从VRAM复制到RAM比从RAM复制到VRAM慢得多。
顺便说一下,我使用glTexSubImage2D从内存复制到VRAM,使用glGetTexImage从内存复制到内存。
为什么?有没有办法提高它的性能,就像将RAM复制到VRAM一样?
发布于 2012-11-30 21:52:38
将数据从GPU传输到CPU总是一个非常慢的操作。
A GPU -> CPU readback引入了一个“同步点”,此时中央处理器必须等待图形处理器完成其计算。在此期间,CPU停止向GPU提供数据,导致GPU停止工作。
现在,请记住,现代GPU是以高度并行的方式设计的,在任何给定的时刻都有数千个线程在飞行。同步点必须等待所有这些线程完成处理,然后才能读回它们的计算结果。一旦读回完成,所有这些线程都必须从零开始重新开始执行...坏的!
异步读回结果(在几帧之后),允许GPU继续执行,而不会导致线程饥饿(上面概述的停止和恢复问题)。这极大地提高了性能- GPU的并行度越高,性能提升越快。
根据您的图形芯片和驱动程序的不同,您可能会通过使用PBOs获得更好的性能。
发布于 2012-11-30 23:12:37
顺便说一下,我使用glTexSubImage2D从内存复制到
,使用glGetTexImage从内存复制到内存。
那么你就不是在复制数据。您正在执行pixel transfer operations,这可能需要修改CPU,具体取决于您的image's internal format、像素传输格式和像素传输类型参数。
由于您没有提供实际的代码,因此无法知道您是否选择了错误的参数。
如果要测试直接复制性能,请使用buffer object。
https://stackoverflow.com/questions/13646401
复制相似问题