CUDA и OpenGL - проблема эффективности - PullRequest
1 голос
/ 19 августа 2011

Интересно, почему способ инициализации vbo имеет большое значение в fps при взаимодействии с cuda. Когда я создаю 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 кадров в секунду

Вы можете проверить это поведение, используя простой пример OpenGL из Nvidia GPU Computing SDK.

1 Ответ

1 голос
/ 19 августа 2011

Потому что в первом случае нет необходимости загружать данные в графический процессор.Во втором случае.

Это разница между:

void *memory = malloc(size);

и

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

Первый обязательно быстрее второго.

Кроме того, вы можете использовать GL_STREAM_DRAW вместо GL_DYNAMIC_DRAW, если вы часто вызываете glBufferData для одного и того же объекта буфера.

...