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