得益于計算機仿真技術的不斷發展,我們能夠在電腦中重建越來越逼真的現實世界,制作出《冰雪奇緣》等優秀的特效電影。
但逼真的場景、豐富的細節離不開超高精度的實體模拟,是以特效的每一幀幾乎都是用經費燒出來的。
現代動畫電影(包括《冰雪奇緣》等),經常使用基于實體的動畫生産特效,豐富感官的體驗。基于粒子的表示是其中常用的方法。場景越大,粒子就越多。比如,要模拟一個 300 米長的潰壩場景中的水,可能會需要數千萬粒子,而這些粒子的存儲需要大量顯存。比如說,如果需要96GB的顯存,則需要購置大量高端顯示卡,如 4 塊 NVIDIA Quadro P6000 GPU。
哦,對了,一塊 P6000 在 Amazon 上的售價約為 4000 美元,而這樣的 GPU,你要買 4 塊。顯然,這個成本不是普通家庭能玩得起的。
針對這一現狀,快手、麻省理工、浙大、清華的研究者進行了實體編譯器自動量化方面的研究,提出了一套用于量化模拟的新的語言抽象和編譯系統——QuanTaichi。它可以使用低精度量化的數字資料類型并将其打包(packing)以表示模拟狀态,進而減少了記憶體空間和帶寬消耗。有了這項技術的加持,高精度的實體模拟隻需要一塊 GPU 就能實作。
QuanTaichi 的實作基于 MIT CSAIL 胡淵鳴等人之前提出的「太極(Taichi)」程式設計語言和編譯器,使開發人員可以輕松地在不同的全精度和量化模拟器之間進行切換,以探索最佳的量化方案,并最終在空間和精度之間取得良好的平衡。相關工作已經入選圖形學頂會 SIGGRAPH 2021,也已經被合入到了太極的開源 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%,讓運算能力不太強的手機運作更複雜的效果。
總體來看,QuanTaichi 不僅可以在通用 GPU 計算領域大幅提升研發效能,助力遊戲中的實體模拟、大尺度圖像處理、媒體編解碼、科學計算等方向,還适用于太極平台上應用的各類模型,能夠提升存儲空間的使用效率,也有助于太極技術生态的未來發展。
目前,太極技術已經讓快手成為首個推出實時液體及煙霧模拟動态效果的短視訊和直播平台,行業首發了「别哭鴨」、「我要去潛水」、「火焰超能力」等特效。其中,「聖誕快樂」魔法表情成為爆款,有 74 萬使用者拍攝并上傳了視訊,大約有兩千多萬使用者觀看了太極支援的這款魔法表情。
技術細節
用于模拟的量化數字資料類型
在 QuanTaichi 中,研究者提出了以下幾種自定義數值類型:
1. 自定義整數類型(Custom Int)由使用者指定位數的整數類型,包括有符号類型和無符号類型;
2. 自定義浮點數類型(Custom Float):由使用者指定位數的浮點數類型,QuanTaichi 為其提供了三種實作:
- 定點數類型(Fixed-point):定點數使用一個自定義整數加一個縮放因子表示,讀取乘以縮放因子實作整型數到浮點數的轉換;讀取時做相反的操作;
- 普通自定義浮點數類型(Floating-point):由使用者指定的小數和指數部分組成;
- 共享指數浮點類型(Shared exponent):同樣由使用者指定的小數和指數部分組成。與普通自定義浮點數類型不同的是,該類型會共享同一個指數部分。實體模拟中的資料通常具有實體含義,當某些數值的絕對值顯著大于其他值時,較小的數值通常影響不大。比如:考慮三維速度(u,v,w),當 x 方向的速度的絕對值遠遠大于其他兩個方向時,v 和 w 的數值并不會對模拟造成顯著的影響。
下圖是三種自定義浮點數在記憶體中的組織形式示例:
位擴充卡類型
目前的計算機體系結構并不支援任意位長度的資料讀寫和計算,是以,研究者在 QuanTaichi 中提出了兩種位擴充卡:
1. 位結構體(Bit structs)。位結構體允許使用者使用多個不同的自定義類型資料(如 custom int 5、custom float 12 等)填充一個完整的計算機硬體原生支援的類型(如 32 位整數等)。
2. 位數組(Bit arrays)。位數組允許使用者在一個硬體原生類型中存儲多個同樣的自定義類型資料。
編譯器優化
1. 位結構體融合存儲
這種優化的核心思想是分析 Kernel 的計算流程,将 bit-struct 内部的成員變量盡可能批量寫入,減少原子性記憶體通路次數。
在實際應用中,一個位結構體中的字段經常一起通路,是以一個位結構體的不同元件很可能被一個 kernel 中的多個語句存儲。在這種情況下,研究者對該位結構中的所有存儲使用一個 atomicRMW(atomic read-modify-write), 以減少記憶體通路開銷。
2. 線程安全推斷
判斷操作是否為線程安全,如果本身是安全的,則不用費時的原子寫操作。QuanTaichi 支援兩種訪存模式的優化:
- 按元素通路(Element-wise accesses)。在并行模拟器中,許多操作以「元素」方式進行:每個獨立線程一次處理一個粒子或體素,與粒子或體素相關的記憶體加載 / 存儲完全不受資料競争的影響。在這種情況下,可以安全地使用非原子操作來執行記憶體加載 / 存儲;
- 位結構體整體存儲(Storing the entire bit struct)。之是以使用 atomicRMW 而不是非原子操作,是為了避免原子位結構體中的部分位被程式并發修改。但當位結構體整體存儲時,我們并不需要擔心這一問題,是以可以使用非原子操作代替計算代價昂貴的 atomicRMW。
3. 位數組向量化
考慮以下情形:
雖然該研究中的系統可以很容易地提高存儲效率,但是這種按位 for 循環的計算效率很低,原因有兩個。首先,我們必須為模拟的 1 位數值使用硬體原生的 32 位整數寄存器,這隻使用了操作位寬度的 1/32。其次,當逐位存儲結果時,為了線程安全,代碼生成器必須發出大量昂貴的 atomicRMW 操作,因為多個 CPU/GPU 線程可能會在一個 u32 中寫入不同的位,進而導緻資料争用。為此,研究者實作了以下三種優化方法:按位進行循環向量化;帶有偏移量的位向量化讀取;位向量化的整數加法。對位數組加載、存儲并對算法進行矢量化,以便每次疊代都處理一個完整的 32 x u1 位數組,而不是單個的 u1。
實驗結果
「生命遊戲」測試
研究者首先在「生命遊戲」上測試了他們的系統。生命遊戲是一個二維網格遊戲,這個網格中每個方格居住着一個活着或死了的細胞。一個細胞在下一個時刻的生死取決于相鄰 8 個方格中活着或死了的細胞的數量。如果相鄰方格活着的細胞數量過多,這個細胞會因為資源匮乏而在下一個時刻死去;相反,如果周圍活細胞過少,這個細胞會因為孤單而死去。
每個細胞的「生」或「死」兩種狀态可以用一個位來表示。在 C 語言等傳統語言中,使用者必須使用 char (u8) 類型來表示細胞狀态,除非他們手動打包 / 拆封這些狀态。但在 QuanTaichi 系統中,使用者可以在不修改任何計算代碼的情況下将存儲效率提升至原來的 8 倍。
OTCA 元像素是「生命遊戲」中的一種特殊結構,該結構由 2048x2048 個細胞組成,其整體行為與單個細胞行為一緻。研究者在單張 NVidia RTX 3080 Ti (10GB) 上實作了 70 x 70 個 OTCA 元像素,即超過 200 億個細胞的生命遊戲模拟。
歐拉流體模拟測試
研究者實作了一個基于稀疏網格的 advection-reflection 流體模拟求解器。通過量化方法,他們成功地将每一個網格所需的存儲空間從 84 個位元組壓縮到了 44 個位元組。在 NVidia Tesla V100(32GB)上,他們實作了超過 4.2 億個激活稀疏網格的煙霧模拟。下圖分别是量化的方案和模拟結果。
MLS-MPM 算法測試
研究者選擇了 MLS-MPM 算法測試他們的系統在混合歐拉 - 拉格朗日方法上的有效性。具體來說,他們選擇了一種量化方案,使得每個粒子消耗的存儲空間從 68 個位元組下降到 40 個位元組。在 NVidia RTX 3090 上,他們實作了超過 2.3 億個粒子的彈性體模拟。下圖分别是量化方案和模拟結果:
由于 iPhone 的 GPU 對整型運算增加了額外的優化和加速,是以研究者還在移動裝置(iPhoneXS)上測試了量化後的 MLS-MPM 的表現。與桌上型電腦相比,移動裝置的計算能力相對有限,并且對實時響應有強烈的需求。是以,它們通常隻能運作小規模的模拟,存儲并不是真正的問題。但在測試中,研究者驚訝地發現:在背景網格上使用量化資料類型仍然是有提升的。因為移動 GPU 通常隻支援 32 位整數的高性能原生 atomicAdd,而并不原生支援浮點數的 32 位 atomicAdd。使用「ti.quant.fixed(fration=32)」表示網格資料可以将軟體模拟的 32 位浮點數 atomicAdd 轉換為硬體原生的 32 位整數 atomicAdd,顯著提高了在 iPhone XS 上運作的 MLS-MPM 程式的 P2G 性能。