【问题标题】:Fastest way to transfer vertex data to GPU in OpenGL / CUDA在 OpenGL / CUDA 中将顶点数据传输到 GPU 的最快方法
【发布时间】:2013-09-20 08:56:15
【问题描述】:

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

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

【问题讨论】:

  • 是的,这将是直接的步骤,但我应该多次更改项目的整个实现以对所有这些进行基准测试。
  • 很难回答...有时上传整个内存块可能比上传特定(仅更改)元素要快得多。

标签: c++ opengl cuda vertex-buffer


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-11-19
    • 2011-05-18
    • 2012-07-07
    • 2012-05-29
    • 2018-10-22
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多