[程式] UnrealEngine中的ISPC與SIMD的一些雜談
部落格版本:
http://dorgon.horizon-studio.net/zh/archives/1805
在研究ISPC的時候發現這東西謎團有點多,因此花了一些時間做了研究並寫成文章
分享給大家
本文開始
SIMD(Single Instruction Multiple Data)指的是用一個指令同時處理多個資料這個概念
,只是我們常常被誤導說,在CPU上可以使用SIMD指令來加速──這種說法其實並不精確
。對,我就是被誤導的那個。在UE4.23時官方整合了ISPC,以更好的幫助CPU做平行化加
速,我之前一直把這東西跟SIMD畫上等號,沒去仔細思考這東西的存在到底想解決什麼問
題。
根據指令數跟跟資料的處理方式,這個概念其實是根據Flynn’s Taxonomy來進行分類,
而SIMD只是其中一種。 見: https://zh.wikipedia.org/zh-mo/%E8%B2%BB%E6%9E%97%E5%88%86%E9%A1%9E%E6%B3%95
SIMD就現行的計算機架構上,分為以下三種:
Vector Architecture:這個架構在以前是是超級電腦的代名詞,最常在教科書上提到的
是1975年的Cray-1,第一個使用這個架構的計算機。
Multimedia SIMD Instruction set extension:看名字就可以知道,它的目的是針對多
媒體應用的ISA的擴充指令集,例如圖像、影片等等影音需求。基本上是架構在Scalar
Processor之上的擴充。
GPU:這個比較好理解,他在架構上有點像是Vector Architecture,但有些微妙的不同。
不過由於Vector Architecture在商業競爭上輸給了Intel因此逐漸式微,以Scalar
Processor為主的設計主宰了過去將近30~40年的時間。輸掉的原因有很多,但主要並不是
技術問題,而是那個時代大部份的人不需要那麼強的計算力,客戶太少,再加上摩爾定律
的推波助瀾下,人們的注意力自然就只集中在由Intel主推擁有最多客戶的架構上。然而
近來由於AI時代的來臨,Vector Architecture架構又重新回到了人們眼界中了,例如
google tensor裡面的TPU就包含了Vector processor,以及最近很火紅的RISC-V,由於設
想目標是embedded devices,不像個人電腦需要考慮兼容性,因此可以大膽的拋棄舊包袱
,轉而使用相關的Vector Operation指令。
另一方面,關於Multimedia SIMD,主要是由於Intel在網路起飛的時代發現我們基於
Scalar Processor的架構還是需要Vector Architecture那種一個指令同時處理多個資料
的加速能力,因此他的解決方式非常粗暴,就是加入新的register跟指令集的方式來支援
這個概念。不過當我們開始疊加register跟指令集之後就開始失控了,每我們加一組新的
register,我們就要追加一堆新的指令集來支援相關Vector操作,從XMM(128 bit)、
YMM(256 bit)到ZMM(512 bit)。這些指令集的擴充非常快速,從1996年開始,幾乎每2~3
年就有新的特性加入,然而為了兼容性,新的指令集在加入x86系統後就非常難被移除,
因此現代指令集暴增的這麼快速有很大的原因可以歸究於Multimedia SIMD的發展。
接下來讓我們來稍微看一下這些擴充指令集,感受一下它發展的混亂吧:從1996年的MMX
,它總共有57條擴充指令使用,到SSE又追加了70條,接著SSE2加入了144條指令,而SSE3
只是在原有架構下的擴充,所以只追加了13條指令。接下來則是SSE4.1跟4.2,又分別加
入了47條跟7條。前面的架構使用到的是XMM register,接下來為了增加平行化的數量,
Intel推出了AVX系列,使用的是YMM register,然後又更進一步的推出了AVX-512,使用
ZMM register。可惜的是我目前沒找到AVX的指令集數量,不過我猜應該有上百個。問了
一下AI,他是跟我說要看所使用的具體版本。
對於最新的AVX512,Linus Torvalds在2020年的時曾經破口大罵說:我希望AVX-512可以
死的痛苦一點(I hope AVX512 dies a painful death)。希望intel不要靠增加魔法指令
來讓跑分好看,要他們回到正軌。
基本上這玩意耗能大,大部份的人享受不到好處,又不是什麼科研計算,也不是server,
一般人在使用電腦的時候又常常需要切換process執行,這代表作業系統會不斷的進行
Context Switch,要知道,每次Context Switch是需要把當前計算用到的register保存下
來,在這一讀一寫之間很容易讓使用者感受到延遲,而且還多佔了空間。
另外在Intel 12th Gen CPU他設計了二種不同架構的P跟E Core,這是常見的大小核架構
,只是小核不支援AVX- 512,沒辦法相容的結果Intel就乾脆把這東西關掉了,雖然能修
改BIOS把這東西開回來,不過看起來有點麻煩。這玩意目前看起來確實是半殘了,今年的
13代一樣延續同樣的架構因此不支援AVX512,不知道這指令會不會如Linus所期望的痛苦
的死去,就讓我們看下去。不過令人意外的是AMD Zen 4之後的CPU倒是支援這套指令集的
。
對於我們程式設計師而言,非常痛苦的是,每次有追加新的指令集我們都需要手動去
include相關的header檔,然後額外針對新的指令撰寫新的程式。
見:
https://stackoverflow.com/questions/11228855/header-files-for-x86-simd-intrinsics
有了以上知識,我們回頭來看Intel ISPC就可很清楚的掌握這技術到底想解決什麼問題了
。在官網上這技術的定義是SPMD(single program, multiple data),就是說我們只要像
GPU寫Shader Code一樣,我們只要部份C++ code用ispc專用的script改寫成一段「
program」存成.ispc這個檔案,在編譯階段它就會自動幫我們把這個檔案拉進去轉成目標
指令集的樣子,這樣子的話,當有新的指令集被加入後,我們只需要重新編譯程式就行,
而不需要再去改寫程式。當然,還要重新編譯新程式這點還是蠻煩人的,不過這個就是擴
充指令集的原罪。
根據Epic官方在Siggraph2019的演講,目前ISPC主要是用在Animation跟Chaos這二個系統
上,在部份關鍵的程式碼上大約會有3倍左右的性能提升。不過需要注意的是,在使用
ISPC後,那些程式片段沒辦法享受到PGO(Profile-Guided Optimization)帶來的效能提升
。
見:Causing Chaos: Physics and Destruction in UE4 | SIGGRAPH 2019 | Unreal
Engine https://www.youtube.com/watch?v=y2QIpPTv6yU
參考:
Linux之父怒罵Intel AVX-512:「我希望它死得痛苦點...」
https://news.xfastest.com/others/82781/linus-torvalds-i-hope-intels-avx-512-dies-a-painful-death/
硬科技:淺談x86的SIMD指令擴張史(上):MMX到SSE
https://www.cool3c.com/article/152918
RISC-V Vector Instructions vs ARM and x86 SIMD
https://medium.com/swlh/risc-v-vector-instructions-vs-arm-and-x86-simd-8c9b17963a31
從 Pentium 回顧 x86 處理器到底哪裡難做
https://blog.moneydj.com/news/2020/10/02/%E5%BE%9E-pentium-%E5%9B%9E%E9%A1%A7-x86-%E8%99%95%E7%90%86%E5%99%A8%E5%88%B0%E5%BA%95%E5%93%AA%E8%A3%A1%E9%9B%A3%E5%81%9A/
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.116.111.188 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1672838112.A.A13.html
推
01/04 22:31,
1年前
, 1F
01/04 22:31, 1F
推
01/04 23:29,
1年前
, 2F
01/04 23:29, 2F
GameDesign 近期熱門文章
PTT遊戲區 即時熱門文章
40
145