为啥我们使用 CPU 而不是 GPU 进行光线追踪?

Posted

技术标签:

【中文标题】为啥我们使用 CPU 而不是 GPU 进行光线追踪?【英文标题】:Why do we use CPUs for ray tracing instead of GPUs?为什么我们使用 CPU 而不是 GPU 进行光线追踪? 【发布时间】:2016-10-28 00:51:08 【问题描述】:

在对光栅化和光线追踪做了一些研究之后。我发现互联网上没有太多关于 CPU 如何进行光线追踪的信息。我遇到了关于 Pixar 以及他们如何在 CPU 上预渲染 Cars 2 的文章。这需要他们每帧 11.5 小时。 GPU不会以相同的图像质量更快地渲染吗? http://gizmodo.com/5813587/12500-cpu-cores-were-required-to-render-cars-2 https://www.engadget.com/2014/10/18/disney-big-hero-6/ http://www.firstshowing.net/2009/michael-bay-presents-transformers-2-facts-and-figures/ 干杯, 山姆

【问题讨论】:

也许他们不在乎那个阶段的速度。 请通过编辑 OP 提供您在提出该问题时引用的文章的链接。 en.wikipedia.org/wiki/Ray-tracing_hardware 和任何关于光线追踪与光栅化的文章都会详细解释原因。 12500 个 CPU 内核?我认为他们实际上是在谈论 GPU。 不,它们是指 CPU 内核(当然,不是所有的都在一个盒子里!)。 【参考方案1】:

我是一家拥有专有渲染器的大型 VFX 和动画长片工作室的渲染软件架构师之一(不是 Pixar,尽管很久很久以前我也曾是那里的渲染软件架构师)。

几乎所有高质量的电影渲染(在所有大型工作室,使用所有主要渲染器)都只有 CPU。出现这种情况的原因有很多。没有特别的顺序,一些真正令人信服的问题可以让您了解这些问题:

只有当一切都在内存中时,GPU 才能快速运行。最大的 GPU 卡有 12GB 左右,它必须容纳所有东西。好吧,我们通常使用 30GB 的几何体和参考 1TB 或更多的纹理来渲染场景。无法将其加载到 GPU 内存中,它实际上太大了两个数量级。因此,GPU 根本无法处理我们最大(甚至平均)的场景。 (使用 CPU 渲染器,我们可以在需要时从磁盘中分页。GPU 不擅长这一点。)

不要相信炒作,使用 GPU 进行光线追踪并不能明显战胜 CPU。 GPU 非常擅长高度连贯的工作(一次对大量数据执行相同的操作)。光线追踪非常不连贯(每条光线可以去不同的方向,与不同的对象相交,对不同的材质进行着色,访问不同的纹理),因此这种访问模式会严重降低 GPU 性能。直到最近,GPU 光线追踪才可以匹配最好的基于 CPU 的光线追踪代码,即使它已经超越了它,也不是很多,不足以丢弃所有旧代码并从有缺陷的 GPU 脆弱代码重新开始.最大、最昂贵的场景是 GPU 仅稍微快一点的场景。在简单的场景中提高速度对我们来说并不重要。

如果您在基于 CPU 的渲染器中拥有 50 或 100 人年的生产强化代码,您不要为了获得 2 倍的加速而将其丢弃并重新开始。软件工程工作量、稳定性等更重要,成本因素也更大。

1234563抛弃。用包含*** GPU 的新机器替换它们会大大增加渲染农场的成本,而且它们更大并且会产生更多热量,因此它实际上可能不适合您的建筑。

阿姆达尔定律:实际的“渲染”本身只是生成场景的一个阶段,GPU 对此无能为力。假设完全生成场景并将其导出到渲染器需要 1 小时,“渲染”需要 9 小时,在这 9 小时中,一个小时用于从磁盘读取纹理、体积和其他数据。因此,在用户体验渲染的总共 10 个小时(按下按钮直到最终图像准备好)中,GPU 可能会加快 8 个小时。因此,即使 GPU 在该部分的速度是 CPU 的 10 倍,您也从 10 小时缩短到 1+1+0.8 = 近 3 小时。因此 10 倍的 GPU 加速仅转化为 3 倍的实际增益。如果 GPU 在光线追踪方面比 CPU 快 1,000,000 倍,那么您仍然有 1+1+tiny,这只是 5 倍的加速。

但是游戏有什么不同呢?为什么 GPU 适合游戏而不适合电影?

首先,当您制作游戏时,请记住它必须实时渲染 - 这意味着您最重要的限制是 60Hz(或其他)帧速率,并且您会牺牲必要的质量或功能来实现那。相比之下,对于电影来说,牢不可破的限制是让导演和视觉特效总监对他或她想要的质量和外观感到满意,以及需要多长时间才能达到(在一定程度上)次要。

此外,在游戏中,您可以逐帧渲染,呈现在每个用户面前。但是对于电影,你实际上是在渲染一次,而交付给影院的是一个电影文件——所以电影观众永远不会知道或关心你是否每帧花费了 10 个小时,但他们会注意到它是否看起来不好。同样,只要它们看起来很棒,对那些需要很长时间的渲染的惩罚就更少了。

对于游戏,您并不真正知道要渲染哪些帧,因为玩家可能会在世界各地漫游,从几乎任何地方观看。你不能也不应该试图让它变得完美,你只是希望它一直都足够好。但是对于一部电影来说,镜头都是手工制作的!大量的人力时间用于构图、动画、照明和合成每个镜头,然后您只需要渲染一次。想想经济学——一旦 10 天的日历(和薪水)进入灯光和合成镜头,在一小时(甚至一分钟)内渲染它与一夜之间的优势相当小,而且不值得图像质量或可实现的复杂性的任何牺牲。

【讨论】:

/me 敬畏地鞠躬:p 我的实时动态 whitted 风格光线追踪器在 GPU 上比在 CPU youtube.com/watch?v=GErl-poxmNE 上快得多。那是在六年前推出的 GTX 580 上。 @z-boson:对于具有少量对象和纹理的场景来说,使用 GPU 可以很容易地提高速度。当您的场景有 1 亿个多边形并引用 600GB 的纹理时,这是非常困难的。 很遗憾 OP 没有询问实时渲染,因为我认为 GPU 上的实时光线追踪会是一个有趣的问题。 对于实时光线追踪,我肯定会选择GPU。但它仅限于比我们通常用于电影的场景复杂性低得多。

以上是关于为啥我们使用 CPU 而不是 GPU 进行光线追踪?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 CUDA 光线追踪器给我这个线程布局的错误代码 700?

是否可以在没有 CUDA/OpenCL 等的情况下使用 GPU 进行光线追踪?

Imagination 推新款GPU IP,首次实现桌面级光线追踪效果

Metal2剖析:基于MPS的GPU加速光线追踪(Accelerating Ray Tracing)

没有得到正确的阴影位置,基于 CPU 的光线追踪

首发评测◆非公版RTX3080—iGame GeForce RTX3080 Ultra 10G