当前位置: 首页 > 科技观察

99行代码实现《冰雪奇缘》特效的再进化

时间:2023-03-12 07:50:17 科技观察

得益于计算机模拟技术的不断发展,我们可以在计算机中重构出越来越逼真的现实世界,制作出《冰雪奇缘》等优秀的特效电影。但逼真的场景和丰富的细节都离不开超高精度的物理模拟,所以几乎每一帧特效都是用资金烧出来的。现代动画电影(包括《冰雪奇缘》等)经常使用基于物理的动画制作特效来丰富感官体验。基于粒子的表示是其中常用的方法。场景越大,粒子就越多。例如,要模拟300米长的溃坝场景中的水,可能需要数千万个粒子,而这些粒子的存储需要大量的显存。比如你需要96GB的显存,就需要购买很多高端显卡,比如4块NVIDIAQuadroP6000GPU。哦,是的,P6000在亚马逊上的售价约为4000美元,而您会购买其中的4个GPU。显然,这笔费用不是普通家庭能够承受的。针对这种情况,快手、麻省理工学院、浙江大学、清华大学的研究人员进行了物理编译器自动量化研究,提出了一种新的用于量化模拟的语言抽象和编译系统——全太极。它可以使用低精度量化数值数据类型并将它们打包来表示模拟状态,从而减少内存空间和带宽消耗。有了这项技术的加持,仅用一块GPU就可以实现高精度的物理模拟。QuanTaichi的实现基于MITCSAILHuYuanming等人此前提出的“Taichi”编程语言和编译器,让开发者可以轻松切换不同的全精度和量化模拟器,探索最佳量化方案,最终达成空间和精度之间的良好平衡。相关工作已入选顶级图形大会SIGGRAPH2021,同时也被收录到太极开源Github库中。论文链接:https://yuanming.taichi.graphics/publication/2021-quantaichi/quantaichi.pdf项目地址:https://yuanming.taichi.graphics/publication/2021-quantaichi/GitHub地址:https://github。com/taichi-dev/quantaichi以下视频展示了量化后的仿真结果。两个野兔形烟雾(4亿体素)的演变与全精度浮点结果一样逼真。但需要指出的是,本demo所需的存储空间仅为全精度浮点模拟的一半!为了验证结果,研究人员还进行了一些用户调查,测试题大致如下。你能说出哪个是量子化的吗?同样的技术也可以应用到手机上,让物理模拟在手机上的速度提升40%,让计算能力较低的手机运行更复杂的效果。总体而言,全太极不仅可以大幅提升通用GPU计算领域的研发效率,还可以辅助游戏中的物理模拟、大规模图像处理、媒体编解码、科学计算等,也适用于各种应用在太极平台上的模型。可以提高存储空间的使用效率,也有助于太极科技生态未来的发展。目前,太极科技已将?打造成为全球首个推出实时液体和烟雾模拟动态效果的短视频和直播平台。特殊效果。其中,“圣诞快乐”魔法表情包一炮走红。74万用户拍摄和上传视频,超过2000万用户观看了这个由太极支持的神奇表情包。技术细节用于模拟的量化数字数据类型在全太极中,研究人员提出了以下自定义数值类型:1.自定义整数类型(CustomInt)用户指定位数的整数类型,包括有符号类型和无符号类型;2.CustomFloat:浮点类型,其位数由用户指定,全太极为其提供了三种实现:Fixed-point:定点使用自定义Integer加上一个比例因子,读数乘以比例因子实现整数到浮点数的转换;阅读时做相反的操作;普通自定义浮点型(Floating-point):由用户指定的小数和指数部分组成;共享指数浮点型(Sharedexponent):也由用户指定的小数部分和指数部分组成。与普通的自定义浮点类型不同,此类型将共享相同的指数部分。物理模拟中的数据通常具有物理意义,虽然某些值的绝对值明显大于其他值,但较小的值通常影响不大。例如:考虑三维速度(u,v,w),当x方向的速度绝对值远大于其他两个方向时,v和w的取值不会有显着差异对仿真的影响。下图是三种自定义浮点数在内存中的组织示例:bitadaptertype目前的计算机架构不支持任意位长的数据读写和计算,因此研究人员在QuanTaichiAdapter中提出了二位适配器:1.位结构。位结构允许用户用多种不同的自定义类型数据(如自定义int5、自定义float12等)填充一个完整的计算机硬件原生支持的类型(如32位整数等)。2.位数组。位数组允许用户在硬件原生类型中存储相同自定义类型的多个数据。编译器优化1.bitstructfusionstorage本次优化的核心思想是分析Kernel的计算过程,尽量批量写入bit-struct内部的成员变量,减少原子内存访问次数.在实际应用中,一个位结构中的字段经常被一起访问,因此一个位结构的不同组成部分很可能被内核中的多条语句存储。在这种情况下,我们对位结构中的所有存储使用atomicRMW(原子读取-修改-写入)以减少内存访问开销。2.线程安全推断判断操作是否线程安全。如果安全的话,就不需要耗时的原子写操作了。QuanTaichi支持两种访问模式的优化:Element-wise访问。在并行模拟器中,许多操作都是“基本地”执行的:每个独立线程一次处理一个粒子或体素,并且与粒子或体素相关的内存加载/存储完全不受数据竞争的影响。在这种情况下,使用非原子操作来执行内存加载/存储是安全的;存储整个位结构。之所以使用atomicRMW而不是非原子操作,是为了避免程序对原子位结构中的某些位进行并发修改。但是当位结构作为一个整体存储时,我们就不用担心这个问题了,所以我们可以使用非原子操作来代替计算量大的atomicRMW。3.位数组向量化考虑以下场景:虽然本研究中的系统很容易实现内存高效,但由于两个原因,这种按位for循环在计算上效率低下。首先,我们必须使用硬件的本机32位整数寄存器来模拟1位值,这仅使用运算位宽的1/32。其次,当逐位存储结果时,代码生成器为了线程安全不得不发出大量昂贵的atomicRMW操作,因为多个CPU/GPU线程可能在一个u32中写入不同的位,导致数据竞争。为此,研究人员实现了以下三种优化方法:按位循环向量化;带偏移量的位向量化读取;和位向量化整数加法。位数组加载、存储和矢量化算法,以便每次迭代处理完整的32xu1位数组而不是单个u1。实验结果“生命游戏”测试研究人员首先在“生命游戏”上测试了他们的系统。生命游戏是一个二维网格,每个方格中都有一个活细胞或死细胞。一个细胞在下一时刻的生死取决于相邻8个方格中活细胞或死细胞的数量。如果相邻方格中的活细胞过多,则该细胞将在下一刻因资源不足而死亡;相反,如果周围的活细胞太少,这个细胞就会因为孤独而死亡。每个细胞的“活”或“死”状态可以用一位来表示。在C等传统语言中,用户必须使用char(u8)类型来表示单元格状态,除非他们手动打包/解包这些状态。而在全太极系统中,用户可以在不修改任何计算代码的情况下,将存储效率提升8倍。OTCA元像素是《生命游戏》中的一种特殊结构,由2048x2048个cell组成,整体行为与单个cell一致。研究人员在单个NVidiaRTX3080Ti(10GB)上实现了70x70OTCA元像素或超过200亿个单元的生命游戏模拟。Euler流体模拟测试研究人员实现了基于稀疏网格的平流-反射流体模拟求解器。通过量化方法,他们设法将每个网格所需的存储从84字节压缩到44字节。在NVidiaTeslaV100(32GB)上,他们对稀疏网格实施了超过4.2亿次激活的烟雾模拟。下图分别给出了量化方案和仿真结果。MLS-MPM算法测试研究人员选择了MLS-MPM算法来测试他们的系统在混合Euler-Lagrangian方法上的有效性。具体来说,他们选择了一种量化方案,将每个粒子的存储消耗从68字节减少到40字节。在NVidiaRTX3090上,他们实施了具有超过2.3亿个粒子的弹性体模拟。下图是量化方案和仿真结果:由于iPhone的GPU对整数运算增加了额外的优化和加速,研究人员还在移动设备(iPhoneXS)上测试了量化后的MLS-MPM的性能。与台式电脑相比,移动设备的计算能力相对有限,对实时响应的需求也比较强烈。因此,他们通常只能运行小规模的模拟,而存储并不是真正的问题。但在测试中,研究人员惊讶地发现,在背景网格上使用量化数据类型仍有改进。因为移动GPU通常只支持32位整数的高性能原生atomicAdd,而不原生支持浮点数的32位atomicAdd。使用“ti.quant.fixed(fration=32)”表示网格数据可以将软件模拟的32位浮点atomicAdd转换为硬件原生的32位整数atomicAdd,显着提高了运行在MLS-MPM程序上iPhoneXSP2G性能。