我正在创建类似于CUDA的东西,但我看到从RAM到VRAM的复制内存非常快,就像从RAM复制到自身一样。但是从VRAM复制到RAM比VRAM慢一点。
顺便说一下,我使用glTexSubImage2D
从RAM复制到VRAM,glGetTexImage
从VRAM复制到RAM。
为什么呢?有没有办法提高它的性能,如将RAM复制到VRAM?
答案 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。