Intel Larrabee GPU 體系結構初覽
從具體的名稱而言,Larrabee 可算是一個在三年前就已經冒出來的名字,首次被證實的文件是一份 Intel “不小心”散布到網絡上的幻燈片——"Tera Tera Tera"。在這份幻燈片中,我們首次看到了 Larrabee 的設計方向、大致架構,特別是其中提到的基于 x86 ISA 部分在當時更是引起了大家的轟動。
Larrabee 本質上的確是一枚基于 x86 的處理器,不過它的片上內核規(guī)模達到了前所未有的數目:32 個甚至更多,不過另一方面它又屬于所謂的同 ISA 異質架構概念,這就給 Intel 帶來了一系列的挑戰(zhàn),特別是如何確保較高的執(zhí)行并行度、如何面對其首番出場所要面對的最大挑戰(zhàn)——游戲圖形渲染與通用計算的平衡。
和 NVIDIA、AMD 以及其他傳統(tǒng) GPU 廠商未到最后一刻絕不對外公布新 GPU 體系架構甚至根本不曾透露(例如 NV30)的做法不同的是,Intel 對 Larrabee 的體系架構除了一些執(zhí)行細節(jié)外基本上是和盤托出,而這還是距它正式發(fā)布的應該有一年左右的時間點。
當然,不僅 Larrabee 如此,事實上 Intel 歷史上發(fā)布的各種處理器大都能提供非常詳細的數據表、手冊、開發(fā)指南以及配套的開發(fā)工具,在技術資源方面力度上是毋庸置疑的。
如此大方的安排有助于我們大致了解 Larrabee 的架構,特別是對許多喜歡一睹為快的讀者來說更是難得的機會可以了解未來 GPU 或者 many-core 處理器的發(fā)展方向。
不過在介紹 Larrabee 之前,我覺得有必要先說說其推出的背景,這對于了解 Intel 為什么要推出 Larrabee 以及如何實現(xiàn) Larrabee 是至關重要的。
正如大家所知道的,從 DirectX 10 開始,Vertex Shader 和 Pixel Shader 的 ISA(指令集架構)已經是統(tǒng)一,VS 和 PS 都能在同一個單元上完成,加上 Stream Out 的引入以及各類開發(fā)工具的推出,把 GPU 應用于通用計算領域已經是漸入佳境的話題。
與以往學術機構里作學術研究的各種 stream processor 不同的是,GPU 有非常龐大、可以媲美桌面 CPU 的市場規(guī)模,這使得開發(fā)人員能夠很容易就獲得便宜的產品為大量的潛在用戶做相應的 GPU 通用運算開發(fā),為軟件增加賣點并獲取更高的附加值,沒有多少人在懷疑這個市場已經在蠢蠢欲動。
讓我們在看桌面 CPU 這面的情況,和整個 90 年代以增加門電路數量密度、時鐘頻率以及指令級并行相比,到了 2003 年整個業(yè)界都認識到了電力、發(fā)熱的物理屏障已經讓時鐘頻率的增長難以維繼,而在指令級并行方面,實現(xiàn)復雜的分支預測、推測執(zhí)行所占用的芯片成本與所能達到的性能提升相比也都開始變得不怎么劃算了,擺在人們面前的性能提升道路似乎就剩下增加門電路這條路還是可以繼續(xù)沖的。
在未來的 10 年里,我們相信半導體產業(yè)依然維持著每兩年晶體管數量增加一倍的發(fā)展趨勢,在這樣的背景下,人們自然而然地想到了推出多核產品,這不僅僅是指目前大家看到的雙核、四核,隨著半導體工藝的推進,更多內核的 CPU 也將在未來的日子里問世,半導體廠商從來都不會讓自己龐大的產能閑置著。
Intel 新近推出的桌面處理器為 Nehalem 架構,這個架構是在一枚 4 cores 的 45nm 桌面處理器,芯片面積大約是 246mm^2,支持SSE 4.2,在 3.2GHz 頻率下的峰值浮點性能為 51.2 GFLOPS(雙精度)或者 102.4 GFLOPS(單精度)。
基于 55nm(其實是 65nm half-node)的 AMD RADEON HD 4870 芯片面積為 260mm^2,750MHz 時峰值浮點性能為 240 GFLOPS(雙精度)或者 1200 GFLOPS(單精度)。
不僅如此,現(xiàn)在 GPU 的帶寬也是 CPU 所無法媲美的,例如 RADEON HD 4870 的內存帶寬就是 115.2GB/s,而 Nehalem 搭配 DDR3-1066 的內存帶寬也就是 26GB/s 左右,在內存容量方面,GPU 也正在迎頭趕上,例如 NVIDIA Tesla 1060 就擁有 4GB 的卡載內存。
不過 GPU 內存子系統(tǒng)雖然有非常高的帶寬,但是它的時延是非常高的,這主要是因為 GPU 主要針對的計算一直以來都比較少出現(xiàn)數據復用(data re-use)的情況,或者說局部性較差,因此基本上只是靠一小塊的 FIFO(先進先出)作為緩存。
對于一些可能復用的地方,例如紋理過濾操作,就會采用比較簡單的 read-only cache,不過龐大的多線程才是 GPU 克服內存時延的最大關鍵所在。
隨著 GPU 踏足通用計算,data re-use 的場合越來越多,即使是現(xiàn)在游戲圖形運算中時常遇到的 post processing,data re-use 也是司空見慣的事情,為此 GPU 廠商也都往 GPU 里加入可讀寫的軟件管理 cache。
最早引入該概念的產品是 NVIDIA 的 G80,它有 16 個內核(稱之為 Streaming Multiprocessor,或者簡稱 SM),每個內核內都有一塊 16KB 大小、時延為 1 個時鐘周期、具備 16 個 bank 的 SRAM,開發(fā)人員透過 CUDA 或者未來的 Compute Shader、OpenCL實現(xiàn)對這塊 SRAM 的控制,而內核執(zhí)行的線程結果可以在這里暫存實現(xiàn)高效的 data re-use。
到這里大家應該都很清楚從技術的角度而言,CPU 和 GPU 的發(fā)展都正面臨著一個拐點,前者因為各種原因不得不延緩“ILP/頻率”這個免費午餐而轉向多核技術,而后者因為制造技術的發(fā)展所新加入的晶體管構成的功能模塊不僅僅限于可以在圖形渲染上使用,包括不少可以并行化的運算也都能拿到 GPU 上高效的執(zhí)行。
這也就連帶產生了市場爭奪的問題。在很長的一段時間里,超級計算機、服務器這類被稱作現(xiàn)金奶牛的市場都是由傳統(tǒng)的 CPU 廠商提供運算部件,現(xiàn)在 GPU 廠商也要插一腳進來,他們在性能上的競爭力實在不容小瞥,而且已經有了一些現(xiàn)成的案例。
這不僅僅是高性能運算領域的問題,在以產量著稱的桌面領域,GPU 涉足的通用計算也越來越讓 CPU 廠商感到不少的隱憂,例如物理加速、視頻處理、三維成品級渲染這類以往需要大量運算資源來完成的任務,GPU 廠商也都開始提供解決方案。
目前的 PC 市場普遍被認為進入了成熟階段,這意味著市場容量在短時間內爆發(fā)性增長的可能性不大,所以 GPU 侵蝕 CPU 傳統(tǒng)優(yōu)勢領域的下場將可能是 CPU 的份額受到擠壓。
對于一般的 design house(設計公司)類型 CPU 廠商來說,這似乎不是什么大的問題,因為他們在營運上的成本主要是研發(fā),而對于垂直型 CPU 廠商(IDM)來說,CPU 份額的下降意味著自己的最強優(yōu)勢——產能將變成非常沉重的負資產。
要避免這個問題的發(fā)生,最好的辦法就是自己也推出類似的產品,Larrabee 就是 Intel 的答案。#p#page_title#e#
每個廠商都會竭力讓自己站在最有利的位置上,IBM 有 Power Everywhere 的發(fā)展策略,Intel 作為 x86 ISA 的始創(chuàng)者自然也有自己的 x86 Everywhere 的算盤。
在歷史上 Intel 曾經推出過若干款圖形芯片,例如 80 年代末期的 i860,90 年代末的 i740,其中前者對部分讀者可能不怎么熟悉,但是當年它的推出其實是引起了不少的轟動,在介紹 Larrabee 的時候我覺得還是有必要提一下這個東西。
在 1989 年的 Comdex 大展上,時任 Intel CEO 的 Andy Grove 罕有地沒有發(fā)表任何演講,根據后來發(fā)表的一些書籍指出,其原因之一在于 Intel 內部正對 RISC 和 CISC 未來的地位展開激烈的討論,而 Andy Grove 正受到這個爭論的困擾。
在當時有各種形形色色的 RISC 預言,例如“在 2005 年你會購買一臺 MIPS 芯片的 PC,而你的鄰居則會購買一臺有 SPARC 芯片的PC”,“486 是 CISC 的黃金時代,但是它還可能是最后的一枚 CISC 處理器”,“586 是最后一枚真正的 CISC 處理器”。
不過 Intel 此時手上除了已經被確定為 386 替代品的 486 外,還有一個 RISC 處理器,這就是 i860。
1986 年,當 Intel 內部已經篤定 486 為 386 換代產品的時候,一位在 Intel 內為 RISC 吶喊了 4 年的工程師 Les Kohn 知道這是無法改變的現(xiàn)實后,決定改變方向,向 Intel 高層提供一個“為 486 設計”的基于 RISC 的協(xié)處理器方案——i860。
在 386 時代,Intel 也提供了與 386 配套但是單獨出售的 387 協(xié)處理器,能夠為 CAD、3D 工作站提供 386 10 倍以上的浮點性能,在這個產品上 Intel 獲取了豐厚的利潤。協(xié)處理器能賺錢,賺很多的錢,所以 i860 作為 486 協(xié)處理器的賺錢期望讓 Intel 終于通過了 Les Kohn 的建議。
然而 Les Kohn 和他的團隊的實際設計目標卻是推出一個與 x86 家族截然不同的產品,i860 屬于不折不扣的 RISC 處理器,但是與 387 和 386 的差別相比還不算太大,Les Kohn 的目標是希望 Intel 最終能比較愉悅地接受 RISC 的概念。
Intel 的 387 協(xié)處理器針對的是 3D、CAD、工作站用戶,這類應用的用戶對性能的追求高于對兼容性的追求,在當時看來 i860 的確是一個不錯的 Intel 涉足 RISC 的突破口。
最終設計出來的 i860 是一枚 64-bit RISC 處理器,擁有單周期雙指令發(fā)射能力以及集成了一個 3D 圖形單元,與其它 RISC 處理器相比,比較特殊的是這枚 i860 在內存管理上復制了 386/486 的換頁機制,這有助于 i860 能比較容易地運行為 386/486 編寫的 C 代碼,從紙面規(guī)格上來看的話,i860 遠不僅僅是一枚協(xié)處理器而是一枚比一般 RISC 處理器更加強大的產品。
i860 和 486 一樣都是一百萬枚晶體管,但是在理論浮點性能和圖形性能上 i860 都遠優(yōu)于 486,這看上去 RISC 的確存在一定優(yōu)勢。
但是i860 最終沒能取得市場上的成功,這牽涉到多方面的原因,而最致命的原因卻是從一開始就已經的被決定了:Les Kohn 要設計的實際上并非是一個能夠賺錢的產品。
和 x86 相比它缺乏軟件支持,而幾乎當時所有的工作站廠商都選擇了開發(fā)、設計自己的芯片,此外它的實際浮點性能也與設計目標相距不少距離,ALU/FPU 的切換需要花費大量的時間,使得它無法成為真正意義上的CPU,更多的是作為它當初被舉薦時候的"想法"——工作站圖形加速器使用。
i860 乃至以后的 Pentium Pro、Itanium、Netburst的發(fā)展證明,Intel 一直都沒有把所有的雞蛋放在同一個籃子里,與這些架構并存的一直都有被證明是成功的“舊架構”并存,486、Pentium、Pentium M 等,這得益于 Intel 強大的技術儲備和研發(fā)資金來支撐,而其他處理器公司大都由于資金限制選擇了孤注一擲的產品研發(fā)模式。
在 Intel 推出 Larrabee 之前,曾經生產過一枚代號 Polaris 的 80 核處理器,這個芯片是被作為未來 Intel many-core 計劃的原型來設計的,片上內核的數量、內核間的連接方式、高帶寬的 3D Stack 內存實現(xiàn)是這枚芯片的主要試驗目標。
80 個內核、成本高昂的 2D Mesh(網面式)內部連接網絡、3D Stacked 內存等一系列在 Intel 歷史上從來沒有真正嘗試過的技術都在這枚 Polaris 實現(xiàn)了,然而這些試驗的成果可能由于時間的關系以及成熟度、可行性等原因,并沒有沒反映到 Larrabee 上。
按照 Ars Technica1 的報道,Larrabee 采用的內核是基于 x86 的 P54C(80502)。而歷史上的 P54C 架構上屬于 P5 的 debug 版,早于支持 MMX 的 P55C(80503)。根據這篇報道,當年 Intel 完成 Pentium 的設計后,交給了美國五角大樓,五角大樓將其用于耐輻射的軍事用途。
而五角大樓有自己的半導體工廠來生產這些軍用的 P54C,由于苛刻的應用環(huán)境,五角大樓還對 P54C 的 RTL(Register Transfer Level,邏輯綜合)代碼進行了徹底的除錯,當若干年后這個軍品版 P54C 完成了歷史使命后,五角大樓將清理好的代碼交給了 Intel,這就是 Larrabee 內核的來源。
更確切的事實來自于 Intel 于 Siggraph 08 發(fā)表的 "Larrabee: A Many-Core x86 Architecture for Visual Computing" 一文中所指出的:
對 Intel 來說,x86 的軟件價值實在是其最大的資財,在歷史上它替 Intel 戰(zhàn)勝了幾乎所有的桌面電腦、工作站、小型機處理器廠商,甚至包括 Intel 自己采用其他 ISA 的產品。Larrabee’s scalar pipeline is derived from the dual-issue Pentium processor, which uses a short, inexpensive execution pipeline.
這次來自 GPU 的挑戰(zhàn)在 Intel 看來不過是當年 RISC vs. CISC 爭戰(zhàn)的延續(xù)或者翻版而已,采用基于 x86 的 many-core 也許可以應對這樣的挑戰(zhàn),而這也是對自己最有利的方案。#p#page_title#e#
雖說 Larrabee 與 P54C 有一定的關系,但是從實際的體系架構來說,我們認為兩者實際上是存在巨大的差異,對 Intel 來說 x86 的引入只是為了能發(fā)揮其既有的傳統(tǒng)軟件優(yōu)勢,為未來 many-core 的大規(guī)模導入進行預演,而在當下 Larrabee 首先必須作為 GPU 推向市場,這樣才能有利于普及產品,這是非常重要的一步。
Larrabee 可以有多種配置形式,上圖為 16 核版本的架構圖
Larrabee 是由許多個 in-order(順序執(zhí)行)的內核以及紋理單元、內部環(huán)路、內存控制器、總線控制器等單元組成,具體的組合形式取決于針對的應用場合,例如作為 GPU 的時候就會整合進 PCIE 作為總線界面,如果是應用于主板上作為協(xié)處理器使用的話,還會整合進 QPI 界面。
在 Intel 的 SIGGRAPH 08 論文中提供了一份 65nm Core 2 Duo 處理器與同樣制程但是支持 Multithread(4 Thread) 并具備 16-way SIMD 向量單元的 Pentium 內核更新版的對比,用來說明采用 in-order 執(zhí)行的流水線在吞吐先決的場合在同樣的面積、耗電指標下所具備的性能優(yōu)勢。
CPU | Core 2 Duo | 類似 LRB 的 Pentium 更新版 |
流水線設計 | 亂序執(zhí)行[OoOE] | 順序執(zhí)行[In-Order] |
內核數量 | 2 | 10 |
各內核單周期指令發(fā)射能力 | 4 | 2 |
各內核 VPU 運算能力 | 4 | 16 |
iL2 cache 容量 | 4MB | 4MB |
各內核單指令流吞吐能力 | 4 | 2 |
共計向量吞吐率 | 8 | 160 |
代號 Conroe 的 65nm Core 2 Duo 芯片面積大約是 143 平方毫米,不過在耗電方面, Conroe 有多種頻率規(guī)格,而頻率與功耗是存在一定的正比關系,在無法確知 Intel 所謂的同樣功耗情況下其實是指什么頻率規(guī)格。
真正的10 個 Larrabee 內核實際上是沒有那么大的 L2 cache 而且是有 FMADD 指令支持的。Larrabee 也不僅僅只有“內核”,還有內存控制器、外部總線控制器、紋理單元、內部環(huán)路等組件,這些組件毫無疑問也是需要占用大量芯片面積。
做一個對比好了,如果單純計算所謂的內核,NVIDIA 65nm GT200 30 個“內核”占的面積大約是 148.8 平方毫米,是整個芯片面積(583.2 平方毫米)的 25%。
我們其實比較難直接對比上表中兩者的浮點性能,表格中能反映的只是 Core 2 Duo 和 10 個類似 Larrabee 架構的內核但是并不實際存在的東西的浮點指標對比,不過從向量吞吐率指標來看,兩者在同頻率下的差別的確較大。
之所以如此,是因為 OoOE 的內核主要是為了追求指令級并行(ILP),有非常復雜的指令控制單元,而 in-order 在這部分上的處理比較簡單,隨著多線程技術的引入, in-order 可以把更多的資源放在擴展數據級并行(DLP)和線程級并行(TLP)上,提供比 OoOE 流水線內核更強大的向量吞吐率。
OoOE 流水線與 in-order 流水線各有特色,前者能維持較高的 ILP,但是流水線的復雜度較高,而后者的流水線復雜度低不少,能夠在同樣的面積、功耗下透過向量技術、多內核、多線程以及適當的固定功能硬件電路等措施加持達到非常高的浮點運算吞吐率。
這使得 in-order 流水線在幾乎所有浮點運算吞吐先決應用場合中成為首選,例如所有的 GPU 以及 XBOX 360 的 Xenon、Playstation 3 的 Cell、SUN 的 UltraSPARC-T1/T2 等等。
Larrabee 糅合了許多目前類似產品的特征,同時結合 Intel 自己的優(yōu)勢,加入了諸如 x86、SMT、QPI、大容量 cache 等技術,再賦予 Intel 強大的軟件開發(fā)支持,力圖成為一個 many core 時代的標志性產物,我們下面給大家進一步介紹其架構細節(jié)。
上圖就是 Larrabee 其中一個 CPU 內核、內部互連網絡、該內核所屬的 L2 cache 局部子集。
Larrabee 內核的指令解碼器能轉譯標準的 Pentium 處理器 x86 指令、x86-64 指令以及專門定制的 VPU 指令(LRBni)。
為了簡化設計,標量單元和向量單元都有自己獨立的寄存器,彼此的數據傳輸/交換是需要先寫入到內存,然后再讀回到 L1 cache 里才能完成。
Larrabee 的 L1 cache 可以讓標量單元和向量單元實現(xiàn)對內存的低延遲高速緩存化存取,結合向量單元(VPU)的 Load 操作就能讓 L1 cache 像是一個擴展的寄存器堆,讓許多算法的性能得到顯著的提升,尤其是使用 Larrabee 提供的 cache 控制指令。
Larrabee 的內核具備 SMT 多線程技術,為了讓這 4 個硬件線程得以充分發(fā)揮性能,Larrabee 內核的 L1 指令 cache 和 L1 數據 cache 從 Pentium(單線程)的 8KB+8KB 擴展為 32KB+32KB 了,這恰好是匹對線程數。
Larrabee 擁有一個基于目錄式一致性設計的二級高速緩存(L2 cache),每個 Larrabee 內的 CPU 內核都在這個 L2 cache 內有自己對應的區(qū)域,這個區(qū)域的大小為 256KB。
所謂的“一致性”簡單來說,就是指在一個存儲器系統(tǒng)中讀取任何一個數據項返回的結果必須確??偸亲罱鼘懭氲臄抵怠?/p>
在單處理器環(huán)境中這個問題很簡單,但是在多處理器的情況下,由于各個處理器很多時候都有各自獨立的 cache (Larrabee 就是這樣),那么情況就會復雜許多,而不同的一致性協(xié)議設計對性能都有直接的影響。
一致性協(xié)議最常見的就是監(jiān)聽式和目錄式,監(jiān)聽式需要較高的的總線帶寬,一般只用在小規(guī)模的多處理器系統(tǒng)中,而像 Larrabee 這樣多達 32 內核的設計,如果使用監(jiān)聽式協(xié)議的話,內部總線的成本將非常高。
故此 Larrabee 的 L2 cache 采取了目錄式的設計,當然這也和 Intel 已經掌握了豐富的 cache 一致性設計經驗有關,而像 NVIDIA 這樣的 GPU 廠商在可讀/寫 cache 上的設計經驗與 Intel 相比就可能有較大的差距。
Larrabee 的每個內核都有連接到自身 L2 cache 子集的直達通道,因此各個內核能夠一起并行地對自身 L2 cache 子集進行訪問操作。內核所寫的數據會被存儲于自身的 L2 cache 子集內并在必要的時候可以被其他內核對應的 L2 cache 子集所沖刷掉。Larrabee 的內部環(huán)狀總線網絡能確保共享數據的一致性。#p#page_title#e#
Larrabee 的標量運算單元實際上就是衍生自 Pentium 處理器的雙發(fā)射超標量流水線,同樣存在類似 Pentium 那樣的 U、V 兩條流水線,其中的主流水線和 SIMD 16 路向量單元共享部分資源。
標量單元能支持 Pentium 處理器的所有 x86 指令,可以運行對應的操作系統(tǒng)內核和應用程序,主要的區(qū)別是加入了 x64 指令、新的標量指令例如 bit count/bit scan 、cache 控制指令和 4 個硬件線程的執(zhí)行能力。
Larrabee 新引入的 cache 控制指令和指令模式能夠實現(xiàn)顯式的 cache 控制,例如可以實現(xiàn)往 L1、L2 cache 預取數據的指令和降低 cache line 優(yōu)先權的指令模式。
流式數據通常很快就會把 cache 內的數據擠兌掉,Larrabee 能夠在每條流式數據的 cache line 被訪問后進行標記以便提前清空。這些 cache 控制指令同樣允許 L2 cache 可以像一個擦寫板內存(scratchpad memory)那樣使用的同時實現(xiàn)完全的一致性,對于提高性能有莫大的裨益。
對于 Larrabee 單個內核內而言,透過多個線程來對 shared memory 進行同步存取的代價并不高。位于單個內核的線程共享相同的本地 L1 cache,因此在 L1 cache 內就能滿足完成一個單獨的原子旗語讀取。相較而言,多個內核之間的同步存取成本就要高多了,因為這需要透過處理器之間的鎖定來實現(xiàn),當然這是一個多處理器設計中眾所周知的難題。
多指令發(fā)射 CPU 的性能損失通常是由于難以找到能一起匹配執(zhí)行的指令。按照 Intel 自己的測試,Larrabee 的雙發(fā)射解碼器擁有較高的多發(fā)射率,主、副指令流水線的匹對原則在這里起關鍵性的作用,它允許編譯器在比一個運行時式的亂序指令采集器更寬的范圍內進行離線分析。
所有的指令都能發(fā)射給 Larrabee 標量單元的主流水線執(zhí)行,這讓編譯器的指令合并難題降低到最低。而次流水線能夠執(zhí)行 x86 的大多數標量指令(包括 load/store、簡單的 ALU 操作、cache 處理)以及向量 store 指令。
編譯器畢竟不是萬能的,對于編譯器無法實現(xiàn)并發(fā)的代碼調度造成的阻塞問題,Larrabee 的 4 硬件線程執(zhí)行能力可以在一定程度上予以掩蓋。
當數據不能預先預取至 L1 cache 而需要從 L2 cache 裝載至 L1 cache 造成的時延問題,硬件多線程執(zhí)行同樣能予以掩蓋。當在相同內核上使用相同的數據組時,運行多個線程同樣能提高 cache 的效率
Larrabee 向量單元(VPU)的最高向量處理寬度為 16,可以執(zhí)行整數、單精度/雙精度浮點指令,Intel 專門找來了多位業(yè)界的資深開發(fā)人員一起協(xié)作開發(fā)專門針對 Larrabee VPU 的指令集——LNI。
VPU 加上它的寄存器所占的面積約只相當于單個內核面積的 1/3,但是它所提供了 Larrabee 的絕大部分性能。
Larrabee 的 VPU 是一個 16-路寬度的 SIMD(單指令多數據)向量處理器,按照 Intel 的說法這是在高運算密度和運算單元利用率上的一個折衷選擇。
依照 Intel 的早期分析,如果采用 16-路單元一次處理 16 個像素單個組元,即采用分離的指令分別處理像素中的紅、綠、藍等組元而不是一次合并處理像素的多個色彩組元,在這樣的方式下典型像素著色器程序(pixel shader)的演算效能可以達到 88%。
Larrabee 的 VPU 指令支持 3 個源操作數,第一個源操作數以及目標數是同一個而且通常必須位于向量寄存器中(某些指令中,頭兩個源操作數的第一個必須是 mask revister),但是指令中的最后一個源操作數可以來自于“內存”,如果數據已經預取至 cache,那么此時的 L1 cache 可以看作是一個擴展的寄存器堆(register file)。
對于 madd 以及 multi-sub 指令,第一個源操作數既是源數也是目標數,因此它們都沒有非破壞性的形態(tài),只有專門設計用于內插的 vmadd233 指令是例外。
VPU 可以讀取自 cache 的數據類型包括了 8-bit unorm、8-bit uint、16-bit sint 以及 16-bit 浮點數據,它們都能在不損失性能的情況下被轉換為 32-bit 浮點數或者整數,由此可以顯著增加可存儲于 cache 內的數據類型并降低專用數據轉換指令的需要。
Larrabee 向量寄存器中的數據可以多種方式在排列上進行對調(即 Swizzle 或者 Re-Order),以達到可以對正 VPU 處理單元通道的需要。位于 cache 內的數據可以直接“復制(Replicate)”到 VPU 的單元通道,這個功能可以在圖形運算和非圖形運算的時候使用,能顯著提高 cache 的利用效率。
Larrabee 的 VPU 能支持多種類型的浮點、整數數據指令,指令集提供了標準的算術操作(例如 fused multiply-add)、標準的邏輯操作(例如從像素中提取出非字節(jié)對齊的欄位),這些都是屬于從寄存器或者內存讀取并把結果寫入到向量寄存器的 load-op(裝載操作)的指令。
配合 load/store 指令,VPU 就能支持在大多數 GPU 中一些較少見或者更復雜的數據格式與浮點值之間進行轉換的操作,對這類操作采用分離指令或者說軟件執(zhí)行的方式可以顯著地節(jié)省芯片面積和電力消耗,而代價只是些微的性能損失。
VPU 的指令還支持 gather 和 scatter 式的操作,允許往非連續(xù)的地址進行 load 或者 store 操作。VPU 的 16 個數據元可以自 16 個不同的向量寄存器地址進行 load 或者 store 操作而不是只能在單個的向量寄存器地址上進行。
這兩個功能的實現(xiàn)可以讓 VPU 的 16 個運算單元并行地執(zhí)行 16 個 shader instance,而每個看起來像是在串列的方式來執(zhí)行,甚至在使用運算出來的索引來執(zhí)行數組存取的時候也能如此。
Gather 和 scatter 的性能受限于 cache,因為每個周期 VPU 只能 load 或者 store 一條 cache line,如果地址分布在若干 cache line 里,那就需要若干次的 load/store,使得 gather 和 scatter 的性能大打折扣,例如地址分布在 16 條不同的 cache line 內就必須需要 16 個周期才能完成一次 gather 或者 scatter 。
按照 Intel 的說法,由于許多工作負荷都具有高度的連貫性存取樣式,因此 gather 和 scatter 的存取周期要遠低于 16 個周期。
透過一個 mask(遮罩)寄存器(VPU 的每個運算通道都對應一個位元的遮罩寄存器),Larrabee VPU 指令執(zhí)行能夠被予以論斷(predicate)。這個 mask 控制向量寄存器或者內存位置哪些部分被寫或者不被更改。
舉例,一個標量的 if-then-else 控制結構能夠透過一條指令來設置 mask 寄存器以基于比對的方式映射(map)至 VPU,而后 VPU 以 mask 寄存器控制的相反極性既執(zhí)行 if 從句部分也執(zhí)行 elsa 從句部分,而不管運算完成后是否寫入結果。
;if (v5<v6) {v1 += v3;} |
以動畫形式展現(xiàn)上面的簡單分支程序如何在 Larrabee 上被執(zhí)行
只有 mask register k7 為 1 的通道的數值才會被完整保存
k7 為 0 的通道的數據均被寫入 1
當 mask 寄存器內都是 0 或者 1 的話,條件從句能被完全地中止掉。這樣能夠減少少數從句出現(xiàn)分支預測失敗而遭遇的性能懲罰,同時也讓編譯器的指令調度器有更高的自由度。
VPU 同樣使用這些 mask 寄存器來給 load/store 指令打包,從而在連續(xù)的內存地址中訪問允許的數據元。這樣程序員就能在滿足復雜分支條件的情況下整合稀疏的執(zhí)行 strand(縷程),使其成為一個能更有效實現(xiàn)向量計算的格式。
按照目前公開的 Larrabee 指令集架構資料,VPU 的 mask 寄存器數量是 8 個,寄存器位寬是 16-bit。#p#page_title#e#
Larrabee 采用了雙向的環(huán)形總線網絡,允許芯片內的代理(Agent)例如 CPU 內核、L2 cache 以及其他邏輯模塊彼此溝通。如果 CPU 內核的數量超過 16 個的時候,就會采用多個短連接環(huán)型總線來掛接,這個結構被稱作 X-Ring。
每條環(huán)形數據總線的各向位寬是 512-bit,所有數據的行程安排都是在注入信息至環(huán)形總線之前就已經確定。例如,每個 agent 能在雙數周期的時候從一個方向接納一個信息包,在奇數周期的時候從另一個方向接收另一個信息包。
這樣的安排能簡化環(huán)形網絡的路由邏輯,當數據出現(xiàn)在網絡上時,這些數據無需被保存在路由器單元中,從而可以實現(xiàn)在非常小的代價下提供競爭最小化的高帶寬。
Larrabee 環(huán)形網絡最初的設計是把 L2 cache 和 內核都作為 agent 掛在總線上,以方便實現(xiàn)一致性,但是這樣帶來的問題是對 Larrabee 來說,環(huán)形總線面臨的傳輸壓力極大,結果這個設計很快就被拋棄了?,F(xiàn)在 L2 cache 配屬給每個 Larrabee 內核,成為 內核的一部分,應用先進的一致性協(xié)議以及 cache 控制指令,確??偩€的壓力盡可能地低。
Larrabee 的 L2 cache 被設計為每個內核可以高帶寬地存取沒有被其他內核寫入結果的內存地址,因此每個內核的數據都是保存在自己對應的 L2 cache 子集部分內。各個內核可以并行地存取自己所屬的 L2 cache 子集,而無須與其他內核進行通信。不過,當在 L2 cache 中分配一條新的 cache line 時,環(huán)路網絡會被用于檢查數據共享,以維持數據的一致性。
這個處理器內部網絡本身也是作為一個 L2 cache 存取內存的路徑。一個典型的高端產品會包括多個標準設計(例如 GDDR3、GDDR5)的內存界面,這些內存界面分散掛接于處理器內部網絡上的若干處以降低擁擠度。
在片上網絡環(huán)繞的延遲會增加內存存取的時間,但是相對于存取外部內存的延遲,額外的環(huán)路延遲通常顯得非常低。
Larrabee 的 CPU 內核可以透過這個片上的環(huán)形網絡總線對固定功能單元進行訪問,而后者也可以訪問 L2 cache 和內存,和內存控制器一樣,這些固定功能單元分散地掛接在環(huán)形網絡的若干處以降低存取競爭。
現(xiàn)在的 GPU 包含了若干功能固化邏輯單元用于不同的圖形運算任務,例如紋理過濾、顯示輸出處理、后著色器阿爾法混合、光柵化(rasterization)以及內插等。
光柵化在這里僅是指確定一個圖元(primitive)覆蓋的 fragmet(片元)位置以及依照圖元的覆蓋樣本位置參數值進行內插的動作。
功能固化單元通常需要若干 FIFO(先入先出)緩存實現(xiàn)負載平衡,這會導致難以在避免浪費芯片面積和性能瓶頸的情況下正確地確定這些邏輯電路及其 FIFO 緩存的大小。
Intel 對 Larrabee 的設計理念是只要軟件執(zhí)行方式的性能足夠,相應的功能固化單元就采用軟件執(zhí)行方式取代。例如,Larrabee 上就沒有包含光柵化、內插或者后著色器阿爾法混合等功能固化單元,使得 Larrabee 可以增進新的功能和最佳化措施,被取代的任務可以在渲染流水線不同位置執(zhí)行,取決于具體的應用程序在什么情況下能達到最高效率。
采用軟件方式執(zhí)行后 Larrabee 可以依據它們對性能的需求進行運算資源分配,而不是設計一些為了攀爬峰值性能的硬件電路。
Larrabee 保留了紋理過濾單元,原因是 Larrabee 的內核還不能高效的執(zhí)行紋理過濾操作。根據 Intel 的分析,在 Larrabee 的內核上以軟件方式執(zhí)行紋理過濾操作,性能只有 Intel 自己設計的紋理單元的 1/12~1/40,性能幅度取決于是否啟用了紋理解壓縮。
對此,Intel 將原因歸結為 4 點:
-
紋理過濾依然普遍采用 8-bit 色彩組元,這類組元在專用電路上處理比 32-bit 寬的 VPU 運算通道更有效。
-
要高效選擇未對齊 2x2 四方圖塊進行過濾處理需要一個特定流水線類型的 gather(聚集)電路。
-
讀取紋理數據至 VPU 用于過濾處理造成的寄存器堆帶寬壓力近乎不可行。
-
在專用硬件上執(zhí)行即時紋理解壓縮的效率要遠遠高于 CPU 內核。
Larrabee 的紋理過濾單元在內部特征上和典型的 GPU 紋理單元相當類似,每個 CPU 內核擁有 32KB 紋理 cache ,紋理單元可以支持所有的常見操作,例如 DirectX 10 已壓縮紋理格式、mipmapping、各向異性過濾等。
Larrabee 的內核透過 L2 cache 向紋理單元發(fā)送指令并透過 L2 cache 接收紋理單元的運算結果。紋理單元和內核使用同樣的 x86 虛擬內存頁面。紋理單元執(zhí)行虛擬至物理頁面轉換并向 Larrabee 內核報告所有的頁面缺失,當頁面在內存的時候,內核發(fā)回紋理過濾指令給紋理單元。
只要軟件執(zhí)行方式的速度足夠快,Larrabee 也可以直接使用其 CPU 內核執(zhí)行紋理操作。#p#page_title#e#
Larrabee 本質上是由若干 CPU 內核構成的 many-core (眾核或者說群核)處理器,理論上可以采用幾乎所有風格的渲染方式,但是前提是必須能實現(xiàn)高度的并行化,Intel 在 Larrabee 的論文中闡述了基于 sort-middle 方式的軟件圖形渲染器,采用 binning(分倉)來實現(xiàn)負載平衡來實現(xiàn)高效的圖形并行處理運算。
什么是 sort-middle? |
所謂的 sort-middle 是相對 sort-first、sort-last 而言,sort 在這里指的是從模型空間轉換為屏幕空間。
Sort-first 是在圖形渲染流水線的開始階段就將圖元(primitive)分配到各個渲染節(jié)點,一般用于多屏輸出或者像 AFR、SFR 這樣的多 GPU 渲染方案;sort-last 是在光柵化后重新分布像素;而 sort-middle 則是在幾何變換(geometry transform)與光柵化之間重新分布圖元。
sort-last 和 sort-middle 比較符合圖形流水線的自然形態(tài),適合硬件實現(xiàn),SGI 的 Reality Engine、Infinite Engine 屬于 sort-middle;大多數的 GPU 以及 NVIDIA NVSG-Scale 的多 GPU 渲染方案都屬于 sort-last 中的 sort-last fragment。
除了這三種主要的 sorting 方式外,還有其他的 sorting,例如將三種 sorting 混合的方式。
關于 sort-first 和 sort-last,大家可以參閱 NVIDIA NVISION08 上的一篇幻燈片:NVISION08-Does_Your_Software_Scale.pdf
基于 sort-middle 模式的渲染器大致可以分為 Tile-based(拼圖式或者說圖塊式)和 Interleaved-based(隔行式)兩種,SGI 的 Reality Engine 屬于 Interleaved-based,而 ImgTech 的 PowerVR 以及 ARM 的 Mali 都屬于 Tile-based。
RTset 的定義 |
在 Intel 的文檔中,Larrabee 采用的是 Tile-Based 的渲染方式,我們以假設渲染一組單獨的 render target(渲染對象)(例如一個像素緩存和一個深度緩存)為例簡單介紹 Larrabee 的渲染原理。
在 Larrabee 中這些 render target 以及對他們進行更動的渲染指令一起被稱作 RTset。
Primitive Set 的定義 |
RTset 的渲染指令通常由圖形 API 所定義一系列遵照當前設備狀態(tài)對一個三角形 batch (批組)渲染時的渲染狀態(tài)變化。Larrabee 渲染器并不采用當前本性狀態(tài)的觀念,而是采用在單一完整定義的結構中捕獲渲染狀態(tài)(這里所謂的單一完全定義結構簡單來說就是指一個 Tile)。
而后 Larrabee 將三角形的 batch 分組并依照使用狀態(tài)對每個 batch 打上 tag(標簽)。這些是三角形的 batch 及使用狀態(tài)被稱作 primitive set (圖元集)或者 PrimSet,大致相當于 Direct3D 里 DrawPrimitive,不過兩者并不完全對等。
RTset 的渲染與 tile、bin 的定義 |
上圖就是 Intel 提供的對單個 RTset 的 PrimSet 進行渲染的大致流程。渲染的畫面被切成若干像素組成的 tile(圖塊),每個 tile 都有一個 bin(圖元倉)來放置 PrimSet 中與該 tile 交疊的三角形。對應整個 RTset 的 bin 被稱為 bin set。有時候 tile 和 bin 在術語上是相通的,不過在這里 tile 是指實際的像素數據,而 bin 是指映射至 tile 的 primitive set(圖元集)。
每個 tile 都有一個 bin,bin 內放的是與之對應的 tile 內交疊的三角形
簡而言之,每個 tile 都有一個 bin,每個 RTset 都有一個單獨的 bin set。
除了三角形外,bin 內還保存有已經著色的頂點、完成光柵化的 fragment(片元),所有的 bin 都保存在片外的內存(例如顯卡內存甚至系統(tǒng)主內存)上。
Tile 的尺寸與性能影響 |
每個 tile 的大小是依據 RTset 的目標表面來設置:tile 的尺寸要能完全放置到 Larrabee 內核的 L2 cache 里。因此,相對使用較少、較低色彩通道的 RTset, 一個有許多色彩通道或者使用高精度數據格式的 RTset 所采用的 tile 尺寸就更小了。
為了簡化代碼,tile 的尺寸通常是正方型或者平方數,典型的大小為 32x32 至 128x128。
如果采用 32-bit 深度和 4D*8-bit 色彩的話,一個 128x128 的 tile 只會占用 256KB L2 cache 的一半空間,如果是 32-bit 深度,4D*32-bit,就可能需要把 tile 尺寸降低到 64x64,因為 128x128 32Z+128C 占的空間已經撐爆掉 L2 cache。
只要 tile 能完全放置在 L2 cache 內,即使是不同尺寸的 tile 渲染速度都不會有顯著的波動。
尺寸較小的 tile 面臨的的問題主要是場景中的某些三角形會在多個 tile 上交疊,因此每個被交疊 tile 都需要對這些三角形進行處理,術語上這被稱作 bin spread (圖元倉跨界)。Tile 越小出現(xiàn) bin spread 的機會就越高,不過按照 Intel 的說法,在現(xiàn)在的渲染應用中出現(xiàn) bin spread 的機會小于 5%,這意味著需要重復處理的跨界三角形數量相對單個覆蓋整個 render target 的 bin 來說少于 5%。