CUDA下的光线追踪

11

我目前正在实现一个光线追踪器。由于光线追踪非常计算密集,而且我也打算研究CUDA编程,所以我想知道是否有人有将两者结合的经验。我无法确定计算模型是否匹配,我想知道会发生什么。我觉得它们并不完全是天作之合,但与没有东西相比,一个体面的速度增加总是更好的。


这里提供一个指针,指向我的开源、可移植(Windows/Linux)GPL CUDA光线追踪器实现。链接为http://users.softlab.ntua.gr/~ttsiod/cudarenderer-BVH.html。 - ttsiodras
2个回答

24
在CUDA中需要特别警惕的一点是,核函数代码中分歧的控制流会极大地降低性能,这是由底层GPU硬件的结构所决定的。GPU通常有着高度同步的数据并行工作负载,其控制流高度一致(即您有数百万像素,每个像素(或至少是大部分像素)都将使用相同的着色程序进行操作,甚至通过所有分支的方向都相同)。这使得它们能够进行一些硬件优化,例如只为每组32个线程拥有单个指令缓存、获取单元和解码逻辑。在理想情况下(这在图形处理中很常见),它们可以在同一周期内将相同的指令广播到所有32个执行单元集合中(这被称为SIMD,即Single-Instruction Multiple-Data)。它们可以模拟MIMD(Multiple-Instruction)和SPMD(Single-Program),但当流多处理器(SM)中的线程分歧(从一个分支中采取不同的代码路径)时,问题逻辑实际上会在每个代码路径之间进行周期性切换。你可以想象,在最坏的情况下,即所有线程都处于不同的路径上时,你的硬件利用率将下降32倍,有效地消除了GPU相对于CPU的任何优势,特别是考虑到从CPU到GPU的数据集传输所需的开销。尽管如此,光线追踪在某种意义上是数据并行的,但即使是相对简单的场景,其控制流也会有很大差异。 即使您设法将一堆紧密排列的光线映射到同一个SM上,您对于初始反弹所拥有的数据和指令局部性也不会持续太久。 例如,想象一下所有32条高度协调的光线弹跳球体后,它们将按照相当不同的方向前进,并且可能会撞击由不同材料制成、具有不同光照条件等物体。 每个材料和光照、遮挡等条件都具有其自己的指令流(用于计算折射、反射、吸收等),因此即使在SM的大部分线程上运行相同的指令流也变得非常困难。 在当前光线追踪代码的技术水平下,这个问题会使GPU利用率降低16-32倍,这可能会导致性能不能满足您的应用要求(尤其是实时应用,例如游戏)。 尽管如此,与CPU相比,它仍然可能更适合用于渲染农场。

现在研究社区正在研究一类新兴的MIMD或SPMD加速器。 我们可以将这些作为软件实时光线追踪的逻辑平台。

如果您对涉及的算法以及如何将其映射到代码感兴趣,请查看POVRay。 还要了解光子映射技术,这是一种比光线追踪更接近于表现物理现实的有趣技术。


也许是时候更新一下了。读到10年后,Nvidia 执行所有 GPU 光线追踪,感觉很有趣。 - user-2147482637

9
可以做到,已经做到了,并且是射线追踪和Cuda专家之间的热门话题。我建议您先浏览 http://www.nvidia.com/object/cuda_home.html
但这基本上是一个研究问题。做得好的人正在从中获得同行评审的研究论文。但是在目前阶段,“做得好”仍然意味着最佳GPU/Cuda结果与CPU/多核/SSE的最佳解决方案大致竞争。因此,我认为现在认为使用Cuda将加速光线追踪器还为时过早。问题在于,虽然射线追踪是“尴尬地并行”(正如他们所说),但它不是那种能够直接映射到GPU的“固定输入和输出大小”的问题--你需要树、堆栈、动态数据结构等。它可以用Cuda/GPU完成,但有点棘手。
如果您是第一次尝试光线追踪并且只是想学习,我建议避免使用Cuda——它需要更长的开发时间,而且您可能无法获得很好的速度。如果您是有一定经验的Cuda程序员,并寻找具有挑战性的项目,而光线追踪只是一件有趣的事情去学习,那么请务必尝试在Cuda中完成。如果您正在制作商业应用程序并希望获得竞争速度优势,那么现在可能是个赌博......您可能会获得性能优势,但代价是更困难的开发和对特定硬件的依赖。

请在一年后回来查看,随着另一代或两代GPU速度、Cuda编译器开发和研究社区经验的发展,答案可能会不同。


我有一个小项目,正在构建我的第一个光线追踪器,以前从未进行过任何CUDA工作,因此我无法做出任何伟大的事情。但在接下来的一年中,我将使用GPGPU技术进行工作。这使我熟悉CUDA,并想知道我可以在多大程度上使用这些知识。 - Morten Christiansen
1
你确定这是一个尴尬的并行问题吗?解决方案是找到下一个反射对象和材料处理的变化(正如Matt J所指出的),似乎会显著破坏并行性。但如果我错了,请纠正我。 - user334911

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