使用CUDA进行光线跟踪

jquia 发布于 2018-04-25 cuda 最后更新 2018-04-25 11:53 228 浏览

我目前正在实施光线跟踪器。由于光线追踪的计算量非常大,而且我将继续研究CUDA编程,所以我想知道是否有人将这两者结合起来。我无法确定计算模型是否匹配,我想知道期望的结果。我得到的印象是,这不完全是在天堂制造的,但体面的速度增加总比没有好。

已邀请:

pullam

赞同来自:

它当然可以完成,已经完成,并且是光线追踪和Cuda大师当前的热门话题。我会先仔细阅读http://www.nvidia.com/object/cuda_home.html 但这基本上是一个研究问题。做得好的人会从中获得同行评议的研究论文。但在这一点上,仍然意味着最好的GPU/CUDA结果与CPU /多核/ SSE上的最佳解决方案大致相当。所以我认为,假设使用Cuda将加速射线追踪器有点早。问题是,虽然光线追踪是“令人尴尬的并行”(正如他们所说),但它不是那种直接映射到GPU的“固定输入和输出大小”问题 - 您需要树,堆栈,动态数据结构等它可以用Cuda/GPU来完成,但这很棘手。 你的问题不清楚你的经验水平或你的项目的目标。如果这是你的第一个射线追踪器,你只是想学习,我会避免Cuda - 它会让你延长10倍的发展,你可能不会得到很好的速度。如果你是一位经验丰富的Cuda程序员,并且正在寻找一个具有挑战性的项目,并且光线追踪只是一件有趣的事情,不妨尝试在Cuda中进行。如果你正在制作一个商业应用程序,并且你希望获得竞争优势 - 当然,这可能是一个糟糕的拍摄点......你可能会获得一个性能优势,但是会以更困难的开发和依赖于特定的硬件。 回顾一年后,答案可能会与GPU速度,Cuda编译器开发以及研究社区体验的另一代或两代不同。

xid

赞同来自:

在CUDA中需要非常小心的一点是,由于底层GPU硬件的结构,内核代码中的分散控制流程绝对是KILLS的性能。 GPU通常具有高度一致的控制流的大量数据并行工作负载(即,您有几百万像素,其中每个像素(或至少大部分像素)将由精确的相同着色器程序操作,甚至在所有分支中采用相同的方向,这使得他们能够进行一些硬件优化,例如对于每组32个线程,只有一个指令高速缓存,获取单元和解码逻辑,在理想情况下,这在图形,他们可以在同一个周期内向所有32套执行单元广播相同的指令(这就是所谓的SIMD或单指令多数据),它们可以模拟MIMD(多指令)和SPMD( Single-Program),但是当Streaming Multiprocessor(SM)中的线程发散时(从一个分支中取出不同的代码路径),问题逻辑实际上在每个循环之间切换每个代码路径。在最坏的情况下,所有线程都处于分离状态e路径,您的硬件利用率降低了32倍,有效地消除了通过CPU在GPU上运行所带来的任何好处,特别是考虑到将数据集从CPU(通过PCIe)整编到GPU。 也就是说,光线追踪虽然在某种意义上是数据并行的,但即使是适度复杂的场景也具有广泛的控制流。即使你设法将一串紧密排列的光线映射到彼此相邻的同一个SM上,你在初始反弹中获得的数据和指令位置也不会持续很长时间。例如,想象所有32条高度一致的光线从一个球体反射回来。在这次反弹之后,他们将会朝不同的方向前进,并且很可能会碰到由不同材料制成的物体,以及不同的照明条件,等等。每个材质和一系列光照,遮挡等条件都有自己的指令流(用于计算折射,反射,吸收等),因此即使在很大比例的情况下运行相同的指令流也变得非常困难SM中的线程数。这个问题与射线跟踪代码的最新技术水平相比,可将GPU利用率降低16-32倍,这可能会使应用程序的性能无法接受,尤其是在实时(如游戏)时。对于例如CPU,它仍可能优于CPU。一个渲染农场。 研究界目前正在研究一类新兴的MIMD或SPMD加速器。我会将这些视为软件的实时光线追踪的逻辑平台。 如果您对所涉及的算法感兴趣并将它们映射到代码,请查看POVRay。同样看光子映射,这是一个有趣的技术,甚至比光线追踪更接近表示物理现实。

funde

赞同来自:

Nvidia今年在NVision的会议上演示了CUDA中的光线追踪器。这里有关于它的幻灯片的链接。 http://www.nvidia.com/object/nvision08-IRT.html