我正在创建类似于 CUDA 的东西,但我看到将内存从 RAM 复制到 VRAM 非常快,就像从 RAM 复制到自身一样快。但是从 VRAM 复制到 RAM 比从 RAM 到 VRAM 慢。
顺便说一句,我glTexSubImage2D
用来从 RAM 复制到 VRAM 以及glGetTexImage
从 VRAM 复制到 RAM。
为什么?有没有办法提高它的性能,比如将 RAM 复制到 VRAM?
将数据从 GPU 传输到 CPU 始终是一个非常缓慢的操作。
GPU -> CPU回读引入了一个“同步点”,CPU 必须等待 GPU 完成其计算。在此期间,CPU 停止向 GPU 提供数据,导致其停止。
现在,请记住,现代 GPU 是以高度并行的方式设计的,在任何给定时刻都有数千个线程在运行。同步点必须等待所有这些线程完成处理,然后才能回读它们的计算结果。回读完成后,所有这些线程必须从零开始重新执行……糟糕!
异步读回结果(几帧后),允许 GPU 继续执行而不会导致其线程饥饿(上面概述的停止和恢复问题)。这极大地提高了性能 - GPU 的并行度越高,性能提升就越高。
根据您的图形芯片和驱动程序,使用PBO可能会获得更好的性能。