在Intel Sandy Bridge微架構(gòu)中,Intel引入了256位SIMD擴(kuò)展AVX,,這套指令集在兼容原MMX,、SSE、SSE2對(duì)128位整點(diǎn)SIMD支持的基礎(chǔ)上,,把支持的總向量數(shù)據(jù)寬度擴(kuò)展成了256位,。新增了若干條256位浮點(diǎn)SIMD指令。 昨天,,Intel剛剛發(fā)布了AVX2指令集,,這套指令集在AVX基礎(chǔ)上做了擴(kuò)展,不過要在2013年發(fā)布的Haswell處理器上才能支持,。參考1給出了AVX2的詳細(xì)特性,。 AVX2指令集概述相比AVX,,AVX2在如下方面做了擴(kuò)展。
跨距訪存支持跨距訪存支持即訪存時(shí),每個(gè)SIMD數(shù)據(jù)的向量數(shù)據(jù)元素可以來自不相鄰的內(nèi)存地址,。AVX2的跨距訪存指令稱為”gather”指令,,該指令的操作數(shù)是一個(gè)基地址加一個(gè)向量寄存器,向量寄存器中存放著SIMD數(shù)據(jù)中各個(gè)元素相對(duì)基地址的偏移量是多少,。有了這條指令,,CPU可以輕松用一條指令實(shí)現(xiàn)若干不連續(xù)數(shù)據(jù)”聚集”到一個(gè)SIMD寄存器中。這會(huì)對(duì)編譯器和虛擬機(jī)充分利用向量指令帶來很大便利,,尤其是自動(dòng)向量化,。另外,參考2中對(duì)跨距訪存指令的功能描述中可以看到,,當(dāng)該指令的偏移地址向量寄存器中任何兩個(gè)值相同時(shí),都會(huì)出GP錯(cuò),。這意味著編譯器還是需要些特殊處理才能利用好這條指令,。 但跨距訪存指令僅僅支持32位整點(diǎn)、64位整點(diǎn),、單精度浮點(diǎn),、雙精度浮點(diǎn)的跨距訪存操作。從參考4可以猜測(cè)其實(shí)gather指令只是在硬件上分解成若干條32位或64位的微訪存指令實(shí)現(xiàn),。這就移位著其實(shí)一條32×8的SIMD訪存其實(shí)就是8次32位普通數(shù)據(jù)訪存,,其訪存延時(shí)和延時(shí)不確定性會(huì)非常大,聊剩于無,。 拓寬原有整點(diǎn)SIMD指令理論上從128位到256位的成倍SIMD寬度擴(kuò)展能帶來一倍的加速,。 從128位擴(kuò)展到256位的整點(diǎn)SIMD指令 位操作指令支持這些指令在加速數(shù)據(jù)庫壓縮、哈希,,大數(shù)的算術(shù)計(jì)算方面會(huì)有幫助,。 任意位置的SIMD數(shù)據(jù)置換支持這一支持將使編譯器可以更靈活的使用這條指令協(xié)助自動(dòng)向量化。像參考5這類工作就能實(shí)施在Intel的芯片中,。 向量-向量移位支持之前Intel上的所有SIMD擴(kuò)展指令的移位操作僅支持所有SIMD數(shù)據(jù)同時(shí)移位相同的位數(shù),,有了向量-向量移位支持,,就可以為每個(gè)SIMD數(shù)據(jù)做不同的移位操作。 浮點(diǎn)乘法累積操作之前的X86處理器上的累積操作多數(shù)針對(duì)整點(diǎn)數(shù)據(jù),,這次針對(duì)浮點(diǎn)數(shù)據(jù)增加的60條SIMD操作會(huì)給Intel跑浮點(diǎn)Benchmark,,比如linpack之類的帶來很多加速。 《編譯點(diǎn)滴》評(píng)論之前幾乎所有在通用微處理器上的SIMD指令,,都傾向于一刀切策略,,即所有的SIMD操作都針對(duì)SIMD數(shù)據(jù)實(shí)施完全相同的操作,并不存在特性化的指令,。比如訪存都是從一塊連續(xù)的地址空間直接訪存,、移位時(shí)所有的數(shù)據(jù)都移動(dòng)相同的位數(shù),數(shù)據(jù)置換指令的支持也是最近才出現(xiàn)在通用CPU中的,。AVX2的這些支持再次肯定了個(gè)性化的趨勢(shì),,CPU中的SIMD支持朝著GPU的方向大踏步前進(jìn),并最終趕上并超越向量機(jī),。不得不稱贊一下IBM的超前思想,。AVX2中的這些特性支持在幾年前的Power處理器中就已經(jīng)出現(xiàn)了。 雖然AVX號(hào)稱可以擴(kuò)展到512位甚至1024位的SIMD支持,,但是所帶來的問題怎么解決,,期待AVX3或者AMD的小宇宙爆發(fā),或者威盛的黑馬:
參考 |
|