用多线程为光线追踪提速

说实话,我在用光线追踪多线程提速的思路帮助朋友调试渲染器的时候,遇到了很多错误。
即使他们的旧Mac Pro拥有8 核CPU,渲染进度条仍然很慢。
后来我改用并行处理,效果立竿见影。
这里有很多技巧。

1 .对于实现原理来说,最重要的是了解如何拆解像素采样。
5 1 2 ×5 1 2 分辨率,以他们1 00spp采样、单线程运行的游戏场景为例。
每次更新像素颜色时,必须计算 1 00 倍的光。
时间复杂度直接是O(width×height×samples)。
我将屏幕分为 1 6 个块,并将每个块定义为一个字符串。
线程池管理比预期更复杂 - 第一帧对于单独运行尤其重要。
考虑一下同时启动多个线程时的冲突。
例如,用 1 6 个线程处理第一帧,然后突然将后续帧减少到 8 个线程,将超过一半的像素计算。

2 对于关键代码,我特别记得SetPixel函数。
他们使用浮点数组来存储颜色值。
我测试了一下,发现颜色分散在1 2 8 spp。
使用float4 代替更稳定。
混色公式的一长行代码经过调试,发现buff[i+3 ]的透明度通道没有更新,结果就是渲染看起来像一层蜡。
使用Random.Range(0,1 f)进行抖动采样;但请注意,在字符串集中生成随机数没有延迟;请注意,否则样本点将被一起填充。

3 关于优化策略有一些特别有趣的细节。
当它们以 3 2 个线程运行时;内存访问实际上已经成为瓶颈。
在多核 CPU 上,访问代码中的列(第 j-- 行)中的像素速度很慢。
改为按等级访问后,速度直接提升了一倍。
后来发现CPU缓存并没有发挥作用——现代CPU的缓存非常昂贵。
如果将buff调整到6 4 字节边界。
效果还能再增强1 0%。
任务粒度控制也很重要。
一开始,每个线程处理 2 个像素。
结果,线程切换的成本超出了计算的范围。
后来我把它转换成3 2 ×3 2 像素,直接保存了2 000次按键。

4 根据影响分析;有一个真实的案例很能说明问题。
使用FDTD算法模拟金属表面反射时,在单线程上运行需要 4 个小时,切换到多线程后,我在 1 5 分钟内就得到了结果。
但要注重质量控制。
例如,如果在 2 00spp 时未使用浮动缓冲区。
颜色值将填充为整数并且为白色。
我几乎没有注意到这一点。
他们尝试将线程数调整为3 2 ,但结果慢了很多。
他们后来发现,对GDI资源的竞争太激烈了——Windows系统渲染过程的限制实在令人恼火。

5 改装提示:非锁定设计确实可以缓解这个问题。
Interlocked.Increment比lock更轻量,但需要注意的是,当前CPU的原子操作缓存一致性协议也很复杂。
当尝试在 Intel Core M 上使用不锁定队列时;这对于 MESI 协议来说是致命的。
强烈建议使用异步 I/O。
他们保存PNG的Save()函数实际上需要5 0%的CPU才能将5 1 2 ×5 1 2 渲染结果保存为PNG。
之后转移到单独的线程;渲染进度条突然变得流畅起来。
他们尝试使用 CUDA 进行 GPU 加速,但调试几何体移除部分花了大约一周的时间。
最后,多线程效率更高。

在这个区域我个人没有跑过OpenCL,但是当多线程达到一定程度的时候。
我觉得系统调度部分将成为新的瓶颈。
在 5 1 2 核集群上运行光线追踪时;实际加速比只有理论加速比的一半——后来实现了InfiniBand网络延迟。
因此,优化不仅仅关注CPU;还关注CPU。
您需要了解整个堆栈。

vivo怎么开启多线程

2 02 2 年,我买了一部vivo手机。
当我想玩游戏的时候,我就想,如何在这款手机上启用多线程模式呢?然后我打开设置,找到Jovi选项,点进去,嘿嘿,果然有游戏模式功能。
点击然后mod就会打开,非常简单。
不过我还是想玩《王者荣耀》,那我就得进入游戏,找到设置,点击基本设置,然后找到多线程模式,开启,然后重新启动游戏。
这个设置有点麻烦。
不过,vivo手机也有一些小技巧。
例如,我可以设置它来查看哪些应用程序使用更多电量并处理它们。
我还可以设置动画提醒。
当有未接来电响起时,手机会跳动,相当有趣。
这样我用vivo手机就更舒服了。