2

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

问题还包括将顶点数据上传到 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() 快吗?

4

1 回答 1

6

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

然而,要复制的数据块的大小很重要。这是一个基准,显示了使用 CUDA 的数据大小和复制速度之间的关系cudaMemcpy()

CUDA - 通过 PCI-E 传输的速度有多慢?

在此处输入图像描述

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

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

于 2013-09-20T10:07:01.983 回答