看板 GameDesign 關於我們 聯絡資訊
部落格版本: 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
coolrobin: 推 01/04 22:31
nicetw20xx: 推 01/04 23:29
rickkcir: 推推 01/09 15:07