Взаимодействие Cuda-OpenGL и многопоточностьC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Взаимодействие Cuda-OpenGL и многопоточность

Сообщение Anonymous »

У меня возникли небольшие проблемы с пониманием того, какие случаи являются потокобезопасными, а какие нет. Например, у меня есть приложение QT с виджетом OpenGL, запускающим средство 3D-просмотра в режиме реального времени.
оно работает в основном потоке.
Затем я вызываю cudaGraphicsGLRegisterBuffer для инициализации cudaGraphicsResource с помощью набора идентификаторов VBO, а затем cudaGraphicsMapResources, все еще в основном потоке.
Затем в другом потоке я запускаю ядро ​​cuda, но перед этим вызываю cudaGraphicsResourceGetMappedPointer.
Этот код примерно описывает происходящее:

Код: Выделить всё

/* This executes on a second thread */
static void do_progressive_render_gpu() {
for(sample s = 0 ; s < SOMEVALUE ; s++){
updateMeshBuffersPtrs(); //Calls cudaGraphicsResourceGetMappedPointer() down the call stack to get those VBOs arrays.
bake_scene_gpu(); // Launches a cuda kernel.
}
}

/* This executes on the main thread with the OpenGL context we use.
* The caller of this function has already registered the VBOs with cudaGraphicsGLRegisterBuffer()
*/
static void start_baking() {
std::function callback;
registerGraphicsResources(); // Calls cudaGraphicsResource
haltRenderers(); // This can be a solution to prevent OpenGL from accessing those resources, but I would prefer to avoid it if possible.
callback = []() { do_progressive_render_gpu(); };
std::thread worker_baking_thread(callback);
//...
//...
// Cleanup and unmap the resources on the main thread later
}
В Linux + Nvidia этот код работает, поскольку я могу видеть данные различных буферов GL, отображаемые в памяти устройства.
Тем не менее, у меня такое ощущение, что позже он меня укусит, потому что updateMeshBuffersPtrs() выполняется в другом потоке.
С другой стороны, вызов RegisterGraphicsResources() во втором потоке фактически вызывает недопустимый cuda Ошибка контекста OpenGL.
Этот код — лишь небольшая часть приложения. Мне нужно параллельное выполнение, потому что мне нужно, чтобы программа 3D-просмотра работала одновременно. Запуск ядра cuda в основном потоке просто заблокирует весь пользовательский интерфейс, а я этого не хочу.
Читая руководство по программированию cuda, кажется, что все функции взаимодействия должны выполняться в одном и том же thread в качестве контекста opengl, с которым мы работаем, поэтому я думаю, что такой способ действий небезопасен, даже если он работает.
Но потом, если я перенесу этот код cuda в основной поток, он просто остановит все

Подробнее здесь: https://stackoverflow.com/questions/793 ... -threading
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»