cuda和opengl - 效率问题

时间:2011-08-18 21:57:36

标签: opengl gpgpu cuda

我想知道为什么初始化vbo的方法在与cuda交互时会对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 fps 2.~75 fps

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

1 个答案:

答案 0 :(得分:1)

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

区别在于:

void *memory = malloc(size);

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

第一个必然比第二个快。

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