在OpenGL / CUDA中将顶点数据传输到GPU的最快方法

时间:2013-09-20 08:56:16

标签: c++ opengl cuda vertex-buffer

我必须在每一帧上传特定元素(更多数千个)顶点数组 - 或者是第一个和最后一个更改值之间的整个区域,但由于它有重新上传整个数组的可能性,效率非常低,无论如何都会上传许多未更改的值。

问题还包括将顶点数据上传到GPU的最快方法。

有几种方法可以做到:

glBufferData() / glBufferSubData()  // Standard upload to buffer
glBufferData()                      // glBufferData with double buffer
glMapBuffer()                       // Mapping video memory
cudaMemcpy()                        // CUDA memcopy from host to device vertex buffer

哪一个最快?我特别关注CUDA方式,这与标准OpenGL方法有所不同。它比glBufferData()还是glMapBuffer()快?

1 个答案:

答案 0 :(得分:5)

无论您使用哪种复制API,从主机到设备复制相同数据的速度都应该相似。

然而,要复制的数据块的大小非常重要。以下是使用CUDA cudaMemcpy()显示数据大小与复制速度之间关系的基准。

CUDA - how much slower is transferring over PCI-E?

enter image description here

如果您知道要调用的复制API的数量以及每个副本的数据大小,您可以简单地从上图估计平均速度。

当元素大小很小且元素数量很大时,通过多次调用复制API来复制仅从主机到设备的单独更改元素绝对不是一个好主意。