2013-09-20 4 views
2

я должен загрузить только конкретные элементы (более тысячи) массива вершин на каждом кадре - или всей области между первым и последним измененным значением , однако он довольно неэффективен, из-за того, что у него есть вероятность перезагрузить весь массив, так или иначе будут загружены многие неизменные значения.быстрый способ передачи данных вершин на GPU в OpenGL/CUDA

Вопрос также включает в себя, что самые быстрые способы загрузки данных вершин на 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()?

+0

Да, это был бы простой шаг, но я должен изменить всю реализацию проекта несколько раз, чтобы сравнить все их. – plasmacel

+1

сложно ответить ... иногда загрузка всего блока памяти может быть намного быстрее, чем загрузка определенных (только измененных) элементов. – fen

ответ

5

Скорость копирования одних и тех же данных с хоста на устройство должна быть одинаковой независимо от того, какой API-интерфейс вы используете.

Однако размер блока данных, который нужно скопировать, имеет большое значение. Здесь приведен пример, показывающий взаимосвязь между размером данных и скоростью копирования с использованием CUDA cudaMemcpy().

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

enter image description here

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

Когда размер элемента мал и количество элементов велико, копирование только отдельных элементов с узла на устройство с помощью вызова API-интерфейса тысячи раз, определенно, не очень хорошая идея.