c++ - 做工作而不是等待 glMapBuffer

标签 c++ opengl gpgpu low-latency

我正在使用 OpenGL 进行一些 GPGPU 处理。所以我有不同的线程为 OpenGL 处理线程提供工作。

在每个“工作项”之后,我需要调用 glReadPixels 和 glMapBuffer 以便将数据从 PBO 传输回主机。然而,这样做的问题是 glMapBuffer 会阻塞线程,并且在 DMA 传输完成之前无法完成任何有用的工作,即使 GPU 处于空闲状态也是如此。解决这个问题的通常方法是创建时间深度为最长 DMA 传输的流水线。但是,由于我在低延迟系统上工作,这是次优的。

有没有一种方法可以在单独的线程上等待 glMapBuffer 或者可以得到一些关于 DMA 传输何时完成的通知 以减少延迟尽可能多?

最佳答案

在 glMapBuffer block 之外的其他线程中做一些额外的工作吗?您可以有多个 OpenGL 上下文,每个都在自己的线程中激活;如果它们被配置为共享对象,它们就可以同时运行。

然而,DMA 实际上意味着 GPU 的工作,至少它的带宽已被完全消耗,因此您最终可能会获得更差的性能。

关于c++ - 做工作而不是等待 glMapBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6085061/

相关文章:

c++ - 为什么 QTabBar 的 tabBarDoubleClicked(int) 不能处理双击标签栏?

C++ 将数组打印到任何输出对象(按函数)

c++ - 什么是 Regal OpenGL?

winapi - Win32 opengl 窗口创建

cuda - GPGPU 上的金融应用

c++ - 如何将一个包含的头文件从一个项目包含到另一个项目? VS2008

java - 如何使用两种不同的语言来编写一个程序?

macos - 如何在 Mac OS 上使用 glGetIntegerv(GL_TEXTURE_BINDING_2D, ...) ?

matlab - 将所有变量转换为 gpuArrays 并不会加快计算速度

cuda - 每 block 最大线程数与共享内存大小