使用CUDA/OPENCL直接在屏幕上绘制

4

是否已经有现成的API(如OpenGL、DirectX、其他)可以直接将CUDA/OPENCL结果绘制到屏幕上?而不是采用典型的绘制纹理矩形方法。

即使注册资源并使用现代CUDA交互方法,我们仍然必须通过整个渲染管线才能渲染一系列颜色。对于像我这样的应用程序,每毫秒都很重要,这是一个问题。


我非常怀疑。CUDA/OpenCL不会钩入光栅化管道。你不仅需要管道,还需要操作系统提供的绘图句柄(在openGL中使用客户端/服务器模型)。编辑:“opencl 1.1现在允许在opencl代码中共享opengl上下文”但它仍然需要通过openGL进行初始化。 - Vengarioth
1
没有一种跨平台的方法可以做到这一点。但是你可能能够想出一些在实践中有效的解决方案。你能提供一些关于你正在开发的平台类型的细节吗? - sharpneli
我一直在想是否有办法修改开源驱动程序,在Linux上为我提供某种可以操作的句柄,但这超出了我的能力范围。我更愿意使用Nvidia显卡。 - user1043761
我同意,你不会在任何现代操作系统中看到这种能力。然而,在嵌入式环境中,你可以想象将帧缓冲地址传递给内核,内核可以直接写入它。但现在即使手机也使用类似OpenGL的UI合成技术,所以这种情况不太可能发生。你最好的选择是写入一个纹理,然后使用操作系统或OpenGL函数来绘制它(或将其作为场景图的一部分)。 - Dithermaster
2个回答

3

使用OpenCL或CUDA无法直接在屏幕上绘制。

这是一个可以解决的问题,但据我所知,NVIDIA没有提供必要的API,因为它们在实现和使用上都非常复杂,而且性能优势也不大。

主要问题有两个:

1)用于渲染的缓冲区布局不同(即您必须使用表面加载/存储功能 - 将CUDA的地址空间映射到图形中不适合,因为线性布局的速度在该上下文中很差),以及

2)将您的CUDA / OpenCL输出合并到演示模型中的平台特定细节(无论是桌面还是翻页全屏体验,如Direct3D游戏,或将应用程序输出合并到桌面)。请记住,现在大多数桌面本身都是翻页的,因此在任何情况下,在前缓冲区上涂鸦都是不被允许的。


1
我非常怀疑使用纹理四边形绘制像素会有任何性能损失,但是您可以使用glDrawPixels直接在帧缓冲区上绘制像素。

我尝试过这两种方法,记得绘制纹理四边形比调用glDrawPixels要快得多。直觉上,人们可能会期望(就像我一样)直接在2D中绘制会更快,但我猜GPU硬件对于3D进行了如此大量的优化,以至于这种期望在实践中并不成立。 - evenex_code
@evenex_code:那不是它变慢的真正原因。原因是GPU被阻塞以执行该写入操作。此外,还需要从RAM传输内存到VRAM以绘制这些像素,这非常缓慢。 - Tara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接