我想知道是否可以在 Cuda 或 Optix 中加速计算沿 3D 体积中从一个点投射到另一个点的线/射线的最小值和最大值。
如果没有,Nvidia GPU 上是否有任何特殊硬件可以加速此功能(特别是在 Volta GPU 或 Tesla K80 上)?
我想知道是否可以在 Cuda 或 Optix 中加速计算沿 3D 体积中从一个点投射到另一个点的线/射线的最小值和最大值。
如果没有,Nvidia GPU 上是否有任何特殊硬件可以加速此功能(特别是在 Volta GPU 或 Tesla K80 上)?
对标题问题的简短回答是:是的,CUDA 和 OptiX 中提供了硬件加速的光线投射。较长的问题有多种解释,因此我将尝试概述不同的可能性。
我看到的问题的不同轴是:CUDA vs OptiX,pre-RTX GPU vs RTX GPU(例如,Volta vs Ampere),最小射线查询与最大射线查询,以及可能的表面表示与体积表示。
预 RTX 与 RTX GPU:
显而易见,由于 GPU 的高度并行性,与 CPU 相比,K80 或 GV100 GPU 可用于加速光线投射。但是,这些 RTX 之前的 GPU 没有任何专门用于光线投射的硬件。有一些不是专门用于光线投射的特殊用途的硬件,您可能会以各种方式利用它们,因此由您来识别和设计这些类型的硬件加速黑客。
从 Turing 架构开始的 RTX GPU 确实具有专用于光线投射的专用硬件,因此它们对光线查询的加速甚至比使用任何 GPU 并行化光线查询所获得的加速还要快。
CUDA 与 OptiX:
CUDA 可用于任何 GPU 上的并行光线追踪,但目前(在我写这篇文章时)它不支持访问专门的 RTX 硬件以进行光线追踪。使用 CUDA 时,您将负责编写所有代码来构建加速结构(例如 BVH)并通过加速结构遍历光线,并且您需要编写相交和着色或命中处理程序。
OptiX、Direct-X 和 Vulkan 都允许您访问 RTX GPU 中的专用光线追踪硬件。通过使用这些 API,可以实现更高的速度和更低的功耗要求,而且它们也需要更少的工作量,因为为您提供了通过加速结构的交叉点和光线遍历。这些 API 还为生产级光线投射提供其他常用功能,例如实例化、变换、运动模糊,以及用于处理光线命中和未命中的单线程编程模型。
最小与最大射线查询:
OptiX 具有返回最接近射线原点的表面交点的内置功能,即“最小查询”。OptiX 没有为最远的交叉点提供类似的单一查询(我假设您所说的“最大”是指这个)。要找到最大距离命中,或距离射线上第二个点最近的命中,您需要跟踪多个命中并跟踪您想要的命中。
在 CUDA 中,您可以自己检测最小和最大查询,因此只要您可以编写所有代码,您就可以做任何您想做的事情。
表面与体积:
你的问题提到了一个“3D卷”,它有多种含义,所以只是为了澄清一下:
OptiX (+ DirectX + Vulkan) 是用于表面光线追踪的 API,例如三角形网格。RTX 专用硬件专用于加速基于表面的表示的光线追踪。
如果您的“3D 体积”指的是体积表示,例如体素数据或四面体网格,那么基于表面的光线追踪可能不是投射光线查询的最快或最合适的方式。在这种情况下,您可能希望在 CUDA 中使用“光线行进”技术,或者查看用于 GPU 的体积光线投射 API,例如 NanoVDB。