【问题标题】:cuda and opengl - efficiency problemcuda 和 opengl - 效率问题
【发布时间】:2011-10-30 04:30:46
【问题描述】:

我想知道为什么在与 cuda 交互时初始化 vbo 的方法会对 fps 产生很大影响。 当我创建 vbo 时,有两种可能性:

  • vbo 只保留给定数据大小的内存空间(在这种情况下,粒子的位置是 第一次在内核中写入vbo,然后在内核中修改):

    gl.glBufferData(GL3.GL_ARRAY_BUFFER, n_particles * 4 * Sizeof.FLOAT, null, GL3.GL_DYNAMIC_DRAW);
    
  • vbo 保留给定数据大小的内存空间并获取一些初始数据(粒子的位置 - 当然这些值稍后会在内核中修改)

    gl.glBufferData(GL3.GL_ARRAY_BUFFER, n_particles * 4 * Sizeof.FLOAT, FloatBuffer.wrap(particlesPositions), GL3.GL_DYNAMIC_DRAW);
    

1.~408 帧/秒 2.~75 帧/秒

您可以使用 Nvidia GPU Computing SDK 中的简单 OpenGL 示例检查此行为。

【问题讨论】:

    标签: opengl gpgpu cuda


    【解决方案1】:

    因为第一种情况不必将数据上传到 GPU。第二种情况。

    区别在于:

    void *memory = malloc(size);
    

    void *memory = malloc(size);
    memcpy(memory, data, size);
    

    第一个肯定比第二个快。

    另外,如果您经常在同一个缓冲区对象上调用glBufferData,您可能希望使用GL_STREAM_DRAW 而不是GL_DYNAMIC_DRAW

    【讨论】:

    • 但在第二种情况下,我在 init 函数中渲染之前初始化 vbo 一次 - 然后将顶点放置在 gpu 内存中。在第一种情况下,我不在主机端初始化 vbo,但后来内核也将顶点放入 gpu 内存。渲染过程中没有数据传输。
    • @Lynx:如果你给它一个初始值,也许 NVIDIA 的实现会将缓冲区放在不同的内存中。没有办法确定。很高兴你找到了一条捷径;英伟达的实现可能有点棘手。
    • “不同的记忆”是什么意思? fps差异太大,应该有一些合理的解释。
    • @Lynx:驱动程序可以在任何地方分配缓冲区对象。系统内存、GPU 内存等。不,不必有“合理”的解释。 NVIDIA 的驱动程序在缓冲对象方面可能有点棘手。
    • 我不是 OpenGL 专家,但据我所知,vbo 与其他方法相比的主要优势是将顶点存储在 gpu 内存中,从而提供最佳渲染结果。因为那个 vbo 被引入了。但正如你上面提到的,不能保证驱动程序在哪里分配缓冲区。那么当数据存储在 gpu 内存之外时,使用 vbo 有什么性能优势呢?这没有道理。能给我解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 2011-09-22
    相关资源
    最近更新 更多