前言:在經過漫長的4年開發期之後,眾望所歸的Fermi「費米」架構GPU終於誕生,這款GPU身上凝聚了眾多「第一」,打破了很多晶片設計的世界記錄。而更為深遠的意義在於,代號GF100的Fermi架構GPU產品,在保持圖形性能的前提下,將通用計算的重要性提升到前所未有的高度。我們根據最近收集的資料,與所有關注顯卡、關注遊戲、關注通用計算的網友一起探尋Fermi架構的設計方向和性能特性。同時,我們共同期待兩家廠商醞釀已久的GPU對決。現在離Fermi最後的發布,僅有1天時間,讓我們共同期待。
Fermi「費米」架構第一印象
●一塊40nm工藝,30億個電晶體的大晶片
由於龐大的運算資源、控制資源和緩存資源的加入,Fermi在設計之初,就沒有考慮過小晶片戰略,因為這是不可能做到的。所以即將登場的,是一塊集成度高達30億個電晶體的單管芯封裝晶片,這是半導體工業的奇蹟。
●基於圖形,但超越圖形的GPU設計方案
Fermi的眾多特性,已經明明白白告訴用戶,這不是僅為遊戲或者圖形運算設計的GPU,而是面向圖形和通用計算綜合考慮的成果。全局ECC設計、可讀寫緩存、更大的shared memory、甚至出現了分支預測概念……這次Fermi拋棄長期使用的「流處理器」稱謂方式,更明確體現了NVIDIA的意圖。
●一塊4核心的GPU,因為它包含4個GPC
GF100擁有這樣的三層分級架構:4個GPC、16個SM、512個CUDA核心。每個GPC包括4個SM,每個SM包括32個CUDA核心。你可以認為GF100是一顆4核心(GPC)處理器,因為這個GPC幾乎是全能的。
●更大更全的緩存
GF100核心,除同樣擁有12KB的L1紋理緩存之外,其擁有真正意義的可讀寫L1緩存和L2緩存。GF100核心的設計思路直接導致GPU中首次出現了64KB的RAM支持可配置的shared memory和L1緩存。
●Tessellation細分曲面單元引入,帶來幾何性能大幅提升
在這之前,3D顯卡的幾何性能的提升過程是非常緩慢的,從GeForce FX 5800到GeForce GTX 285,顯卡的像素渲染能力提升了超過150倍,但是幾何性能僅僅提升了不到3倍。DirectX 11要求的硬體Tessellation單元改變了這樣的狀況,Fermi更是將細分曲面單元做到了你不可思議的規模。
●TMU和ROP等後端單元的增強
代號RV770的HD4870是AMD非常成功的一款產品,它用最小的電晶體消耗,打擊了對手NVIDIA的痛處——GPU後端設計。所以我們看到在開啟高倍AA等效果時,後端強大的GPU性能衰減能夠得到有效控制。這次Fermi架構重點增強了GPU後端設計,而且力度不小。
●底層計算單元不斷改進
毫無疑問,G80到GT200以來,NVIDIA的MIMD架構流處理器設計一直是圖形晶片中效率最高的,雖然它很耗費電晶體,但是以最後實際性能衡量,還是很划算的。這次Fermi延續了這種設計,但是在計算單元和周邊資源方面做了擴充,更高精度和更小性能衰減是永遠的目標。
●GPU設計更貼近應用,也更偏向CPU
Fermi放棄了GPU固有的簡潔明快的設計理念,轉而向更深層次發展,但是更強的線程控制能力和周邊資源的充沛度,已經讓Fermi打開了「潘多拉魔盒」……NVIDIA如果能應付得了這些問題,將在GPU領域取得一系列突破,如果應付不了各種撲面而來的問題,這種設計所付出的代價有可能拖垮NVIDIA整個公司。
圖形性能與通用計算並重的設計方向
代號GF100的Fermi設計方案在4年前確定下來並付諸行動,這時正值代號G80的Geforce 8800GTX做最後的出廠準備。G80憑藉全新的MIMD(多指令流多數據流)統一著色器(又稱流處理器)獲得了業界的一致認同,同時被業界關注的還有G80的通用計算性能。
NVIDIA的Tony Tamasi先生(NVIDIA高級副總裁,產品與技術總監)表示:「以前的G80架構是非常出色的圖形處器。但Fermi則是一款圖形處理同樣出色的並行處理器。」
這句話揭示了Fermi的與眾不同,它已經不再面向圖形領域設計了,因為更廣闊的通用計算市場在等待它。Fermi將為通用計算市場帶來前所未有的變革,圖形性能和遊戲被提及已經越來越少。
NVIDIA公司在不斷強調並行計算的重要性
從NVIDIA處理器架構的發展來看,Tamasi先生的話意思很清楚。回顧歷史我們可以發現NVIDIA最近幾年間,大規模改進圖形處理架構設計的是GeForce 6000(NV40)系列,之後就是GeForce 8000(G80)和GeForce GTX 200(GT200),最後就是Fermi。
「CUDA Cores」是Fermi最基礎的運算單元,將它的歷史向上追溯首先是G80時代的統一著色單元(Unified Shader Model),我們在G80和GT200時代將它統稱為流處理器(Stream Processor),再向上追溯可知,這個單元將Vertex Shader(頂點著色器)和Pixel Shader(像素著色器)合併而成。
理論上說「CUDA Cores」只是起了一個好聽的名字,讓人們更看重GPU通用計算的作用,實際上我們在圖形領域還是將它視為普通的流處理器。但這背後透露出NVIDIA公司的另一種計劃——面向並行計算領域設計一顆晶片,並使其具備圖形運算能力,這顆晶片由眾多的「CUDA Cores」組成,運算速度主要由「CUDA Cores」的數量和頻率決定。
Fermi就在這種設計目標下誕生了,你可以說它不是GPU,因為它真的是一顆並行通用計算晶片,只不過它也能安裝在顯卡上幫你運行遊戲。不過對於我們評測人員就比較麻煩,Fermi誕生之後,我們需要對它的底層運算性能和實際運算表現做評測,但是拿它和誰對比呢?是HD 5870,還是I7-965?
似乎它們都沒有可比性,也沒有統一的評比標準。一切可以在Fermi上運行的程序,I7-965也能辦得到,但是大規模並行速度慘不忍睹;很多Fermi能做的工作,HD 5870卻做不了,因為它沒有足夠的周邊資源諸如LDS(Local Data Share)支撐這麼多流處理器同時運作,同時這顆GPU身上更找不到任何可讀寫的緩存。
在沒有了解Fermi的核心構成之前,很多人「CUDA Cores」概念嗤之以鼻,認為這是NVIDIA公司的營銷策略,就像HD5870所擁有的1600個流處理器一樣,實際上是320個SIMD單元。兩家公司確實打了不少口水仗,無數玩家也跟著它們提出的概念升級了自己的顯卡。不過這次Fermi改變名稱和設計方向,是有備而來的。
越來越多的機構和廠商意識到通用計算的重要性
NVIDIA這次敢提出圖形性能和通用計算並重,說明GPU設計的重點和難點都在通用計算方面而非圖形。因為一顆已經演化了十年的GPU肯定能做好自己的老本行圖形計算,但是要做通用計算,需要更強大的線程管理能力,更強大的仲裁機制,豐富的共享cache和寄存器資源以及充足的發射端……如果做不好這些東西,GPU永遠都是PC中的配角,永遠都是一顆流處理器。這些表面上看這些部件是極佔電晶體的東西,更可怕的是設計這些部件需要太多科研成本和時間。
Impress Watch網站知名IT評論人後藤弘茂稱NVIDIA全新Fermi架構,是以處理器為目標進行設計的。因為你在Fermi身上可以看到以前GPU上從來沒有的東西,包括更多的指令雙發射、統一的L2全局緩存、64KB的可配置式L1或者Shared Memory、大量的原子操作單元等等。
當然圖形性能也毫不含糊,除了非常暴力的處理核心「CUDA Cores」之外,Fermi擁有強大的ROP和TMU單元,可以提供更高級別各種AA算法,並且有效控制性能衰減。Gather 4指令可以有效助力抖動採樣實現更高畫質。全新設計的PolyMorph Engine(多形體引擎)核心概念——Tessellation功能是必不可缺的,雖然這個概念由微軟提出,由AMD率先應用在GPU上並堅持到HD 5870,但是這次呈現在我們面前的Fermi在Tessellation多數據並行計算方面遙遙領先HD 5870。
Fermi運算單元構成模式
●GF100整體架構
GF100 GPU基於圖形處理團簇(翻譯為GPC),可擴展流陣列多處理器(SM)和內存控制器(MC)。一個完整GF100實現四個GPC,16個SM和6個內存控制器。通過對GPC的開啟和關閉,對SM和內存控制器不同的配置,可以劃分出滿足不同價位的產品。所以我們也可以稱GF100為一個4 GPC核心的GPU。
Fermi架構GF100功能單元分布
圖中我們可以看到GF100的總線接口、GigaThread線程調度器、四個完整的GPC單元、六個內存控制器、六個ROP簇和768KB二級緩存。每個GPC單元包含四個多邊形引擎。六個ROP簇緊鄰二級緩存。
CPU的命令通過Host Interface總線接口傳輸到GPU。在GigaThread引擎會從系統內存提取指定數據,並把它們拷貝到指定的顯存。 GF100集成了6個64位GDDR5內存控制器(共計384位),以便獲得高帶寬和低延遲。然後GigaThread引擎創建並調度這些block到各個SM,其次再到warp(每個warp包含32個threads線程)交給CUDA Core和其他執行單位。在GigaThread引擎重新分配工作時,圖形流水線上的各個單元如細分曲面和光柵化之類的單元也會繼續工作。
GF100擁有512個CUDA Core,它們屬於16個SM單元,每個SM單元包括32個CUDA內核。每個SM是一個高度平行處理器,最多支持在任何規定時間完成對48個warp的處理 。每個CUDA Core是一個統一的處理器核心,執行頂點,像素,幾何和kernel函數。一個統一的768KB二級緩存架構負責線程加載、存儲和紋理操作。每組SM裡四個紋理單元,共享使用12KB一級紋理緩存,並和整個晶片共享768KB二級緩存。每個紋理單元每周期可計算一個紋理尋址、拾取四個紋理採樣,並支持DX11新的壓縮紋理格式。
Fermi架構GF100核心照片
GF100擁有48個ROP單元,用來執行抗鋸齒和原子內存操作。這48個ROP單元被分配為6組,每組8個,每組ROP配備一個內存控制器。內存控制器、L2高速緩存和ROP單元是緊密耦合的,也可以成組屏蔽。所有ROP單元和整個晶片共享768KB二級緩存(GT200裡是獨享)。
關於運行頻率,在每一組SM陣列裡,紋理單元、一二級緩存、ROP單元和各個單元的頻率也都完全不同於以往。除了ROP單元和二級緩存,幾乎其他所有單元的頻率都和Shader頻率(NVIDIA暫稱之為GPC頻率)關聯在一起:一級緩存和Shader單元本身是全速,紋理單元、光柵引擎、多形體引擎則都是一半。
Fermi顛覆了G80以來的分頻模式,曾今我們稱固定單元的頻率是GPU核心頻率,而流處理器頻率較高,它的速度是核心的2.15或者2.25倍。從Fermi開始「核心頻率」就是流處理器頻率(也可以稱為GPC頻率),而固定單元的頻率默認為「核心頻率」的一半,未來的超頻模式肯定要發生變化了。
●Fermi GPC運算架構
我們可以這樣認為:NVIDIA的第一代CUDA機構是從G80開始延伸至GT200,而GF100將是第二代CUDA架構產品。G80核心的誕生奠定了NVIDIA未來核心架構的主方向,並一直延續至GT200,當然在發展的過程中NVIDIA還是會對核心整體進行優化調整,但總體來說就是累積電晶體增加硬體規格,功能方面並無變化。反觀Fermi,核心硬體規格數量相比GT200確實也有大幅增長,但是在產品整體架構上Fermi做了很大改動,可以說是顛覆性改動,它不僅僅是借鑑以前成熟的架構體系,還調整並在架構上新增功能模塊,令Fermi不再簡簡單單的是圖形核心,而是一個複合型功能核心。
在NVIDIA產品進入DirectX 10的統一架構後,我們看到核心中引入了TPC(Thread Processing Cluster)、SM(Streaming Mulitporcessor)和SP(Streaming Processor)等新概念。例如,G80擁有8個TPC,每個TPC擁有2個SM,每個SM擁有8個SP,這種由繁化簡的結構一直延續在NVIDIA的圖形產品中。
G80和GT200的TPC構成,圖片來自Anandtech網站
通過對比G80、GT200到GF100的發展模式,我們看到SM矩陣數量在減少,而每個GPC中SM數量和每組SM中SP數量在增加。在這中架構設計理念上GF100雖然是延續了G80的組成設計,但是每個組成模塊的數量優化上有了大幅改變。
GF100圖形架構核心,從硬體的塊數稱為圖形處理團簇(GPC)。每個GPC包含一個光柵引擎和四個SM單元。GPC是GF100佔主導地位的高層次的硬體模塊。除了計算單元它還包括兩個重要特點——分別是一個可升級的光柵引擎(Raster Engine)、Z-cull和一個帶有屬性提取和細分曲面的多邊形引擎(Polymorph Engine)。
Fermi架構GPC架構圖
正如其名稱所示,所有的GPC都集成了關鍵的圖形處理單元。它包括頂點,幾何,光柵,紋理均衡設置和像素處理資源。隨著ROP單元功能的不斷增強,一個GPC單元可以被看作是一個配置齊全的GPU,而GF100擁有4個這樣的核心。
●並行幾何處理流水線設計
傳統的GPU幾何單元設計使用了一個單片前端用來獲取、裝配和光柵化三角形。這種固定管線模式只能提供性能固定的並行執行內核數量。而隨著應用程式的工作量不同,這條幾何管線常常瓶頸或利用率不足。單一的幾何處理管線在面對複雜的幾何需求時,成為GPU性能的主要障礙。
Fermi具備的光柵並行化是一個重要創新。NVIDIA稱Fermi GF100是一個全新架構,不但是通用計算方面,遊戲方面它也發生了翻天覆地的變化,幾乎每一個原有模塊都進行了重組:有的砍掉了,有的轉移了,有的增強了,還有新增的光柵引擎(Raster Engine)和多形體引擎(PolyMorph Engine)。
光柵引擎(Raster Engine)
光柵引擎嚴格來說光柵引擎並非全新硬體,只是此前所有光柵化處理硬體單元的組合,以流水線的方式執行邊緣/三角形設定(Edge/Triangle Setup)、光柵化(Rasterization)、Z軸壓縮(Z-Culling)等操作,每個時鐘循環周期處理8個像素。GF100有四個光柵引擎,每組GPC分配一個,整個核心每周期可處理32個像素。
多形體引擎(PolyMorph Engine)
多形體引擎則要負責頂點拾取(Vertex Fetch)、細分曲面(Tessellation)、視口轉換(Viewport Transform)、屬性設定(Attribute Setup)、流輸出(Stream Output)等五個方面的處理工作,DX11中最大的變化之一細分曲面單元(Tessellator)就在這裡。Fermi GF100產品中有16個多形體引擎,每個SM一個,或者說每個GPC擁有四個。
憑藉多形體PolyMorph引擎,Fermi實現了全球首款可擴展幾何學流水線,該流水線在單顆GPU中包含了最多16個Tessellation引擎。這些引擎在DirectX 11最重要的全新圖形特性GPU加速Tessellation中能夠發揮出革命性的性能。通過將更加細膩的幾何圖形融入到場景當中,Tessellation讓開發人員能夠打造出視覺清晰度極高、更加複雜的環境。鋸齒邊緣平滑了,從而使遊戲中所渲染出來的人物能夠擁有影院般細膩的畫質。
在以前的架構中,固定功能單元只是單一的一條流水線。而在GF100,無論是固定功能單元和可編程操作單元都並行設計,這大大提高圖形性能,也解決了GPU長期以來未有重大突破的性能短板。
多形體PolyMorph引擎的出現,是幾何流水線近幾年間不斷演化的重大突破。特別是細分曲面操作,需要的三角形和光柵能力都異常可怕,傳統GPU無法應對。多邊形引擎的出現大幅度提高了三角形、細分曲面和流輸出能力。通過給每個SM搭載屬於自己的細分曲面Tessellation硬體單元,並為每個GPC搭載屬於自己的光柵化引擎,GF100最終為我們提供了高達8倍於GT200幾何性能。
為了增加計算單元的效能,更好地配合計算核心,降低存儲器延遲,緩存的概念引入到功能處理器中,例如CPU現在已經擁有L1、L2和L3三個等級緩存,而在GPU中緩存概念還是十分模糊。主要原因是GPU的運算核心數量太多,緩存需求量太大,而另一個方面,在以往的GPU通用計算程序中,確實很少有用到緩存,特別是可讀寫的真正意義上的緩存。
CPU和GPU功能性單元對比
為了增加GPU的計算能力和計算效率,NVIDIA工程師大膽的將緩存概念引入到GF100中,自然引入緩存勢必需要大量電晶體完成,在這點上與CPU道理相同。這樣的選擇要承擔很大風險,但是面向應用設計的GPU必須進行改進,也必須直面問題而不能迴避。為了在滿足數據計算吞吐率的前提下,NVIDIA工程師為GF100設計了一套實用靈活的L1和L2。
通過了解不同的成千上萬的應用程式,NVIDIA工程師發現shared memory可以解決一部分程序的需求,但是不能解決所有的問題。一些應用程式天然需要shared memory,有些應用程式則需要緩存cache,有的既需要shared memory也需要cache。優化的內存設計可以既提供shared memory也提供cache,可以讓程式設計師根據自己的需求來做選擇。Fermi架構通過變化存儲器的資源配置,可以同時支持這兩種需求。
Fermi架構可配置緩存結構
GF100的每一個SM中擁有64KB的可配置片上緩存,可以設置為48KB共享緩存加16KB L1緩存,也可以設置為16KB共享緩存加48KB L1緩存。在之前的GT200核心中,並沒有L1緩存的設計。L1緩存可以用於處理寄存器溢出、堆棧操作和全局LD/ST。過去,GPU的寄存器如果發生溢出,會大幅度增加存取時延。
有了L1緩存以後,即使臨時寄存器使用量增加,程序的性能表現也不至於大起大落,雙精度等運算的衰減控制也將更為優秀。對於那些無法預知數據地址的算法,例如物理計算、光線追蹤都可以從GF100的專用L1緩存設計中顯著獲益。共享緩存的設計則有利於多線程間數據重用,讓程序把共享緩存當成緩存來使用,由軟體負責實現數據的讀寫和一致性管理。而對那些沒有使用共享緩存的應用程式來說,也可以直接從L1緩存中受益,顯著縮減運行CUDA程序的時間。
GT200和GF100架構緩存構成形式與容量對比
Fermi有768KB的統一的L2緩存,可以支持所有的存取和紋理操作。L2緩存和所有的SM都相通。L2提供有效和高速的數據支持。有些算法不能在運行前就確定下來,像一些物理問題,光線跟蹤,稀疏矩陣乘法,尤其需要緩存的支持。過濾器和轉換器需要所有的SM都去讀取相同數據的時候,緩存一樣會有很大的幫助。
而Fermi的對手代號R800的HD5870所具備的cache是不可隨便調用的,HD5870的緩存實際上是傳統的Texture cache,只不過現在可以用來臨時釋放結果做LDS(Local Data Share),不可編程,不可操作,不可寫,只讀。所以R800現在是16KB LDS+16KB cache,也就是說專用LDS只有16KB。
這裡順便提及Fermi首次在GPU中引入全局ECC的作用。Fermi是第一款支持內存錯誤檢查和修復(ECC)的GPU架構。在使用GPU做大數據量的處理和高性能計算的時候,ECC是有大量的需求。在醫療圖像處理和大型集群中,ECC是最有用的特性。
正常情況下的內存位的存儲錯誤,都會引起軟體的錯誤。ECC就是在上述錯誤沒有多系統造成影響的情況下,用來檢查和糾正這樣的錯誤。由於這樣的錯誤會根據系統的增大線性的增加,ECC就成為大型集群中必不可少的需求。
Fermi架構GPU的寄存器,共享內存,L1緩存,L2緩存和DRAM內存都受到ECC保護,這樣的設計部只是為了高性能的GPU應用,也是為了增加系統的可靠性,這是大規模部署Tesla等高端通用計算產品的前提。但是ECC技術是在原來的數據位上外加位來實現的,所以支持ECC技術的Fermi實現各種存儲的代價,都要大於普通GPU。當然我們也找到另外一種說法稱FermiDRAM ECC實現機制和傳統CPU每8-bit增加一個位元的方式不一樣,是一種專利方式。
●強大的線程調度能力
關於線程的調度問題,我們首先需要了解一些G80以來CUDA架構的線程關係。
線程結構:CUDA將計算任務映射為大量的可以並行執行的線程,並且硬體動態調度和執行這些線程。Kernel以線程網格(Grid)的形式組織,每個線程網格由若干個線程塊(block)組成,每個線程塊又由若干個線程(thread)組成。實質上,kernel是以block為單位執行的,CUDA引入Grid只是用來表示一系列可以被並行執行的block的集合。各block是並行執行的,block間無法通信,也沒有執行順序。目前一個kernel函數中有一個grid,而未來支持DX11的硬體採用了MIMD(多指令多數據)架構,允許在一個kernel中存在多個不同的grid。
線程、線程塊和執行內核的關係
Block:CUDA中的kernel函數實質上是以block為單位執行的,同一block中的線程需要共享數據,因此它們必須在同一個SM中發射,而block中的每一個線程(thread)則被發射到一個SP上執行。一個block必須被分配到一個SM中,但是一個SM中同一時刻可以有多個活動線程塊(active block)在等待執行,即在一個SM中可以同時存在多個block的上下文。當一個block進行同步或者訪問顯存等高延遲操作時,另一個block就可以「趁虛而入」,佔用GPU資源,最大限度利用SM的運算能力。
Warp:在實際運行中,block會被分割為更小的線程束,這就是warp。線程束的大小由硬體的計算能力版本決定。在目前所有的NVIDIA GPU中,一個線程束由連續的32個線程組成。warp中的線程只與thread ID有關,而與block的維度和每一維的尺度沒有關係,這種分割方式是由硬體決定的。以GT200的角度來解釋,warp中包含32條線程是因為每發射一條warp指令,SM中的8個SP會將這條指令執行4遍。在硬體中實際運行程序時,warp才是真正的執行單位。雖然warp是一個由硬體決定的概念,在抽象的CUDA編程模型中並不存在,但是其影響力絕對不容忽略。
●SM單元的雙warp調度能力
Fermi的每一個SM都有兩個指令發送單元,可以同時讓兩個warp相互獨立的並發運行。Fermi的Dual warp調度機制可以同時並發調度兩個warp的一條指令分別在16個一組的CUDA core上進行計算,或者在16個存/取單元運行,或者4個SFU上運行。Fermi的調度器並不需要在指令流之間進行附屬檢查。利用如此優美的雙發射調度機制,使得Fermi可以讓硬體的計算能力達到極致。
Fermi架構的Warp運行關係
在Fermi架構中,非常多的指令可以進行雙發射,例如兩條整數運算指令,兩條浮點數運行指令,或者混合的整數,浮點,存取,和SFU特殊處理指令都可以被並發執行。單精度和雙精度的指令一樣可以並發執行。
●並行指令更自由
NV不斷充實周邊資源,使用更激進的架構,而AMD不斷擴大流處理器規模,都是為了更好的隱藏延遲。GT200架構已經可以控制SMIT活用跳轉來在實現線程在不同的SM單元之間進行跳躍。命令單元為multi-thread模式,能夠執行Out-of-Order指令,而當處理warp命令流時則是In-Order,而根據NV架構設計師John Nickolls的介紹,GT200架構實際warp中的線程也能夠支持Out-of-Order。
Fermi在每個SM前端都有兩個Warp調度器和兩個獨立分配單元,和SM其它部分完全獨立,均可在一個時鐘循環裡選擇發送一半Warp,而且這些線程可以來自不同的Warp。分配單元和執行硬體之間有一個完整的交叉開關(Crossbar),每個單元都可以像SM內的任何單元分配線程(不過存在一些限制)。
作為運算單元的CUDA核心在Fermi的SM每個單元中共2個組,每組16個,SFU有4組,載入/存儲單元16個。這4個小組能夠各自並行執行不同的Warp不同的指令。由於CUDA核心是16個一組,16線程並列會讓物理vector變長。因此2個周期能夠以32線程構成的單Warp的一個指令。載入/存儲單元也同樣如此。SFU因為是4線程並列,因此是以8周期執行1個warp。這樣指令單元本身增加到了2個,各個指令單元能夠每個周期發出2條指令。可以說Fermi實現的並行化指令自由度更高。
●GigaThread線程調度優化
Fermi架構的另一個重要特性,就是它的雙層分布式調度機制。在片上的層面(SPA Streaming Processor Array,流式處理器矩陣級別),全局的分布式線程調度引擎(global work distribution engine)分發block到每一個SM上,在SM層面,每一個warp分布式調度引擎按照32個線程為一個warp執行。
Fermi實現了SM級別的雙發射,意味著SPMD(單線程多任務)的實現。從並行kernel下探到最底層,實際上就是靠的SM級別的雙發射。SM級別的SPMD上升到GPU核心級別,Fermi就是MPMD(多線程多任務)。這種設計已經越來越像CPU,而且隨著GPU的發展,每走一步,就多像一份。
Fermi實現了SM單元級別的雙發射
第一代GigaThread線程調度引擎,在G80架構中實現了12288個線程的實時的調度管理。Fermi架構不只是增強了原有的機制,而且引進了更快的context上下文交換機制,並行kernel執行機制,增強了線程block的調度能力。Fermi的這項能力相對於上一代GPU提高了10倍。
同時像CPU一樣,GPU也可以利用context上下文交換機制來管理多任務的切換,每一個任務都可以用分時的方式利用處理器的計算資源。Fermi的運算流水線經過優化設計,把context上下文的切換時間減少到了10~20毫秒,極大的優化了上一代的GPU架構。不只是性能的提高,這個設計可以讓開發者創建更快的kernel-to-kernel應用程式,例如讓程序在圖形和PhysX上的應用,圖形與物理效果處理之間的運算也將受益於更快的context上下文交換機制。
●並行執行內核Concurrent Kernel Execution
並行執行內核讓資源利用更充分,計算速度更快
Fermi支持kernel並發運行,同一應用程式的不同kernel可以同時運行在GPU上。Kernel並發機制可以讓應用還曾向執行更多的kernel來發揮GPU的能力。例如,PhysX應用程式需要計算流體和固體,如果是串行執行,只能利用一半的線程處理器。Fermi的架構可以讓同一個CUDA context的kernel都同時運行在同一個GPU上,這樣可以更有效的利用GPU的資源。不同應用程式context的kernel函數也可以通過更快速的context切換,更快地運行在GPU上。
細分曲面技術帶來的變革
在遊戲畫面的生成過程中,我們一般看到的是3D畫面的貼圖,但是隱藏在貼圖裡面的還有3D畫面的骨架——幾何構圖。3D畫面的形成首先要構建幾何構圖,然後再進行渲染。幾何構圖越複雜,最終形成的物體表面就越接近現實。可以認為Tessellation細分曲面是DirectX 11為我們帶來的最重要的革新。
曲面細分示意圖,曲面越複雜越接近真實
DirectX 11提供的Tessellator單元本身不具備可編程性,因此DirectX11向Tessellator單元輸入或者從中輸出的過程是通過兩個傳統的管線階段完成的:Hull Shader (HS,外殼著色器)和Domain Shader (DS,域著色器)。
Hull Shader負責接收瑣碎的圖形數據和資料,而control points將會基於如何配置Tessellator來產生數據。可以說,Tessellator就是一個固定功能模塊,用來處理一些基於一定參數的輸入數據。最後Domain Shader將會接收由Tessellator產生出的點,並依照終點控制(control points)置換貼圖將這些點形成一個合適的幾何圖形。
實際上R6xx和R7xx硬體都具有Tessellation單元,但是由於Tessellation屬於專有實現方案,是AMD的獨有技術,因此應用並不算很廣泛。而在AMD 的推動下,此次Tessellation成為了DirectX 11中的一個必備的部分,AMD長期不懈的堅持終於得到回報。
在此之前,人們對低代價多邊形操作法已經探索了近10年,從最開始的對三角形的fan操縱,到後來的龜裂和衝撞檢查,這些方法可以實現曲面細分效果,但是對資源的消耗量太大不可控制。這次微軟在DirectX 11中加入硬體Tessellation單元,我們可以視作曲面細分技術歷經長時間的磨練後修成正果。雖然它不太符合通用處理單元的設計方向,但是如果計算電晶體的投入與性能回報,獨立的硬體Tessellation單元是目前最好的選擇。
ATI一直強調的Tessellation是創造更多紋理細節、陰影以及平滑邊緣的幾何圖形的最佳途徑之一。而且,高級幾何圖形同時也需要真正的、完美的位移貼圖。當前,大部分幾何圖形都是通過紋理渲染和某些諸如凹凸貼圖、視差貼圖之類的技術模擬實現的。開發者們採用Tessellation技術的話,我們可以看到非常逼真的物體效果,而且隨著DX11的普及,NVIDIA以及AMD最終將會從Tessellation技術中獲益。
GF100擁有更多的PolyMorph(多形體引擎),是以SM(流處理器)為單位分配的,擁有多達16組。多形體引擎則要負責頂點拾取(Vertex Fetch)、細分曲面(Tessellation)、視口轉換(Viewport Transform)、屬性設定(Attribute Setup)、流輸出(Stream Output)等五個方面的處理工作。
Tessellation效果性能對比
DirectX 11中最大的變化之一細分曲面單元(Tessellator)就在這裡,因此GF100的理論Tessellation性能將會遠超HD 5870(核心代號Cypress),因為Cypress只有一個Tessellator單元。這些硬體上的設計,讓GF100在進行Tessellation操作時,性能下降很少。
總體來看,Fermi的多形體引擎相對於以前絕非幾何單元改頭換面、增強速度而已,它融合了之前的固定功能硬體單元,使之成為一個有機整體。雖然每一個多形體引擎都是簡單的順序設計,但16個作為一體就能像CPU那樣進行亂序執行(OoO)了,也就是趨向於並行處理。NVIDIA還特地為這些多形體引擎設置了一個專用通信通道,讓它們在任務處理中維持整體性。
當然這種變化複雜得要命,也消耗了NVIDIA工程師無數的精力、資源和時間。有一種傳言說,多形體引擎是GF100核心變化的重要組成部分,也是GF100無法在去年及時發布的最主要原因。這麼做也是不得已而為之。考慮到細分曲面單元的幾何複雜性,固定功能流水線已經不適用,整個流水線都需要重新平衡。通過多形體引擎的並行設計,幾何硬體不再受任何固定單元流水線的局限,可以根據晶片尺寸彈性伸縮。
遊戲畫質進一步改善
由於ROP和TMU單元的資源空前充沛,Fermi可以給玩家更好的遊戲畫質體驗,包括更先進的採樣技術和性能衰減更小的抗鋸齒加速。
代號RV770的HD4870是AMD非常成功的一款產品,它用最小的電晶體消耗,打擊了對手NVIDIA的痛處——GPU後端設計。所以我們看到在開啟高倍AA等效果時,GPU的性能衰減能夠得到控制。而這次Fermi架構也增強了後端,而且力度不小。
眾多資料中,我們首先了解到的是Fermi架構的GF100所支持的Gather4抖動採樣指令。DirectX 11詳細定義了顯卡需要提供的特性,但對渲染後端的工作涉及甚少,所以NVIDIA做了多形體引擎,還有抖動採樣。抖動採樣不是新技術,長期用於陰影貼圖和各種後期處理,通過對臨近紋素(Telex/紋理上的像素點)進行採樣來創建更柔和的陰影邊緣。它的缺點也是非常消耗資源。
DirectX 9/10上抖動採樣是分別拾取每一個紋素,DirectX 10.1開始改用Gather4指令,NVIDIA則在硬體上使用單獨一條矢量指令。NVIDIA自己的測試顯示,這麼做的性能大約是非矢量執行的兩倍。
Gather4抖動採樣指令細節圖解
Gather4指令,使四個紋理映射到一個128×128的單紋理指令像素。GF100的DirectX 11實現4倍節省硬體資源的Gather4,大大加快陰影映射、環境閉塞和後期處理算法。隨著抖動取樣的應用,遊戲可以實現平滑柔和陰影或自定義紋理過濾效率。對遊戲開發者來說,這意味著消耗的硬體資源更少;對遊戲玩家來說,則意味著更好的畫質。
在採樣過程優化的同時,遊戲玩家關注的抗鋸齒效果也在不斷發展。CSAA全稱 Coverage Sample Anti-Aliasing(覆蓋採樣抗鋸齒),G80時代已經被NVIDIA引入,不過當時只支持到16X,Fermi將這個數值提升到了32X,並且將色彩取樣和覆蓋取樣分開處理:8個色彩取樣,24個覆蓋取樣,畫質和性能都顯著提升。
8X和32X CSAA的效果對比
Alpha to Coverage可以使用全部採樣點,擁有33個透明級別,上圖是GT200不使用覆蓋採樣與GF100採用32X CSAA的效果對比,32X CSAA效果更為溫潤出色。相比傳統的抗鋸齒模式,Fermi執行CSAA性能下降非常低,32X CSAA性能下降只有傳統8X的0.7%左右。
這一切性能衰減方面的優秀表現,都離不開NVIDIA對GF100的ROP和TMU單元做出的改進。關於GPU後端這部分資源,我們將在以後的評測中為大家詳細分析。
底層計算單元的改進和效果
雖然在CUDA概念裡,CUDA core或者SP就是一個內核,但是從目前實現的硬體整體而言,CUDA core其實只是一個功能單元而已。真正能比較接近於我們常說的內核,則是CUDA core的上一級——Streaming Multiprocessor(簡寫為SM),因為目前只有在SM這一級才具備Program Counter(程序計數器)、調度資源以及分離的寄存器堆塊。
一個CUDA Core運算核心的構成
Fermi的每個SM擁有32個高性能CUDA Core——這是四倍於G80/GT200的設計,每個CUDA core都有全流水線化的整數算術邏輯單元(ALU)和浮點單元(FPU)。Fermi的ALU幾乎採用完新的設計,支持64bit和擴展的精確的指令運算,同時支持計算,移位,布爾值,比較,轉化和更多的指令操作。
Fermi的所有流處理器現在都符合IEEE 754-2008浮點算法(AMD的Cypress架構也是如此)和完整的32位整數算法,而後者在過去只是模擬的,事實上僅能計算24-bit整數乘法;同時Fermi全面引入了積和熔加運算(Fused Multiply-Add/FMA),每循環操作數單精度512個、單精度256個(G200僅支持單精度FMA)。所有一切都符合業界標準,計算結果不會產生意外偏差。
和MAD(multiply-add)指令相比,Fermi所支持的FMA指令在做乘運算和加運算的時候只在最後運算的時候作一次捨入,不會在執行加法的時候就出現精度損失,精度比把操作分離執行更高。當然我們需要了解的是,GT200在執行雙精度浮點運算的時候,使用的是FMA指令,這就證明GT200時代SM中的DPU雙精度單元已經成熟滿足了FMA指令所需的硬體要求。
FMA指令在精度上的優勢
●4個特殊功能單元Four Special Function Units (SFU)
特殊函數處理單元處理超越函數,包括sin、cosine、求倒數、平方根。每一個SFU在一個周期內每一個線程可以執行一個指令操作,每一個warp執行需要8個周期。指令分發器可以按照當前SFU的運行情況來分發指令,當一個SFU在進行運算的時候,可以將指令分發到其他的SFU處理單元。
●雙精度設計Designed for Double Precision
Fermi的雙精度浮點(FP64)性能也大幅度提升,峰值執行率可以達到單精度浮點(FP32)的1/2,而過去只有1/8,AMD現在也不過1/5,比如Radeon HD 5870分別為單精度2.72TFlops、雙精度544GFlops。由於最終核心頻率未定,所以暫時還不清楚Fermi的具體浮點運算能力(雙精度預計可達624GFlops)。
雙精度的浮點計算在高性能計算中有著核心的重要位置,在求解線性代數中,數值計算量子化學中都會需要雙精度浮點運算。Fermi架構為支持雙精度浮點運算進行了特別設計每一個SM在一個時鐘周期內可以完成16個雙精度浮點數的FMA操作。是在GT200架構以後又一激動人心的設計。
雙精度運算中Fermi架構的性能提升
●快速原子內存操作
在多進程(線程)的作業系統中不能被其它進程(線程)打斷的操作就叫原子操作,文件的原子操作是指操作文件時的不能被打斷的操作。原子操作在並行計算中非常重要,它可以讓線程對共享的內存結構做正確的讀寫操作。
原子操作包括add、min、比較和交換、讀、修改和寫操作,它們都不用打斷其他的正在運行的線程。原子操作被大量使用在並行存儲、縮減和並行的建立數據結構中,而不需要鎖定線程的執行。
Fermi原子操作能力提升
大量原子操作單元和L2緩存的使用,大大增強了FermiGPU架構中的原子操作能力。在相同位置的原子操作,Fermi的速度比GT200快20倍,連續的內存操作是GT200的7.5倍。
在GPU支持的內存尋址空間方面,GT80/GT200都是32-bit的,最多搭配4GB GDDR3顯存,而Fermi一舉支持64-bit尋址,即使實際尋址只有40-bit,支持顯存容量最多也可達驚人的1TB,目前實際配置最多6GB GDDR5——仍是Tesla。
同時Fermi統一了尋址空間,簡化為一種指令,內存地址取決於存儲位置:最低位是本地,然後是共享,剩下的是全局。這種統一尋址空間是支持C++的必需前提。而以前的架構裡多種不同載入指令,取決於內存類型:本地(每線程)、共享(每組線程)、全局(每內核)。這就和指針造成了麻煩,程式設計師不得不費勁清理。
首次引入遊戲計算架構
過去的GPU在處理遊戲中的圖形運算時,幾乎不能做其他操作。唯一可以做的就是在支持PhysX物理效果的遊戲中提供一定的物理運算支持。遊戲中的AI(人工智慧)、景深、光線追蹤等等效果,都是依賴CPU運行的。GPU無法對其進行加速。
Fermi架構引入的遊戲計算架構(Compute Architecture for Graphic),打破了這一傳統。隨著通用計算的盛行,專業領域和民用領域都前途無量,NVIDIA CUDA並行計算架構就會在GF100Fermi架構中繼續發揚光大,而且用途更加廣泛,單就遊戲而言受益也是多方面的。
可編程著色器的運算性能近年來有了很大的進步。展望未來,可編程仍然在GPU中將繼續充當壓倒一切的重要性,它可以讓開發人員能夠創建新一代的視覺效果。光柵化(Pasteurization),光線跟蹤(ray tracing)和雷耶斯法(Reyes)是眾所周知的一般渲染算法。截至Fermi出現之前,GPU的設計仍然純粹為光柵化。開發人員繼續尋找新的方式來改善他們的圖形引擎,GPU則需要善於多樣化和不斷增長的圖形算法集。由於這些算法是通過一般通用計算API,所以GPU的運算能力對一個強大的計算架構的執行效率是至關重要的。從本質上講,可以認為遊戲計算架構是一種新的可編程著色應用。
GF100的計算架構是設計之初就考慮到射線追蹤。GF100是第一款GPU硬體支持遞歸,可以高效的實現光線追蹤算法和其他圖形算法的GPU。GF100的L1和L2緩存大大提高光線追蹤性能,改善就細粒內存訪問的效率。L1緩存提高了鄰近的光存儲效率,而二級緩存,進一步放大了整個處理系統的存儲帶寬。
CUDA架構的實現途徑多種多樣,CUDA C、CUDA C++、OpenCL、DirectCompute、PhysX、OptiX Ray-Tracing等等。這其中既有NVIDIA自己似有的開發方式,也有開放的業界標準規範,開發商可以自由選擇。
GPU遊戲計算架構實例
在遊戲中,NVIDIA CUDA計算架構可以執行畫質處理、模擬、混合渲染等等,實現景深、模糊、物理、動畫、人工智慧、順序無關透明(OIT)、柔和陰影貼圖、光線追蹤、立體像素渲染等大量畫面效果。
NVIDIA還宣稱,GF100的遊戲計算性能相比GT200有了大幅提高,比如PhysX流體DEMO演示程序3.0倍、《Dark Void》遊戲物理2.1倍、光線追蹤3.5倍、人工智慧3.4倍。
下面簡要介紹幾個GPU遊戲計算的實例:《地下鐵2033》是近期推出的一款FPS遊戲,其景深效果的計算就採用了DirectCompute。採用以往傳統的後處理方式效果並不能讓人滿意,而採用皮克斯的技術則系統資源消耗則會太大,而採用CUDA則能很好的協調技術研發者和遊戲開發者之間的工作。
GPU遊戲計算架構模擬出非常真實的景深效果
Capcom發售的Dark Void就利用了NVIDIA APEX Turbulence模塊技術,用來表現機械和武器的開火和粒子效果。
CUDA還可以用於遊戲的AI尋路計算,可以高效的計算最短路徑,並可以做衝突預測,GF100在尋路方面以提供三倍於GT200的性能。
流體模擬基於粒子層次,模擬超過128000個粒子互動,甚至包括液體表面張力計算,GF100可以提供兩倍於GT200的性能,這樣的技術可以廣泛應用於遊戲的水流、泥漿和血液等流體的物理特性模擬。PhysX 3.0得益於並行核心程序執行,相比之前性能可以有20-40%的提升,而在實際遊戲應用中性能提升會更為明顯。
GF100的光線追蹤採用光柵化和光線追蹤組合的方式,主要光源依然採用光柵化,而陰影和反射採用光線追蹤的方式,GF100得益於新的緩存架構在這一應用中可以提供四倍於GT200的性能。
Fermi是否挑戰半導體工藝極限
一顆擁有了眾多改進並且重新設計的GPU晶片,總是能引起我們的無限遐想。Fermi架構的GF100核心擁有多大的理論浮點值我們在文中幾乎沒有提及過,而讓我更著迷的是Fermi如何繼承G80和GT200的優秀傳統,將實際和理論的差值降到最小。
前文已經告訴大家,Fermi用追加大量的寄存器和線程調度資源解決了這一問題,讓編程者不再迷茫怎樣改寫程序才能達到最佳狀態,用戶也不必擔心自己的GPU會不會因衰減太過嚴重而遠離標稱性能。
但是以上兩項改進,讓Fermi付出了太大的電晶體代價,有人甚至疑惑Fermi是如何在一塊晶片上裝進了512個CUDA核心,也有人稱這種行為是NVIDIA賭博式的激進,最終要付出代價……
實際上Fermi面臨的問題在兩個層面,首先是半導體物理學極限。普遍觀點認為過高的電晶體集成度會給一塊晶片造成不能承受的發熱和功耗,但是如何量化「過高」這個概念?實際情況是Fermi的30億個電晶體在應用40nm工藝時,尚未觸碰這個問題。我們得到的消息是Fermi的運行頻率和功耗都可控,最主要的一點是GTX480功耗在250W左右,沒有超越PCI-E 2.0規範要求的300W。
臺積電40nm工藝內部互聯層示意圖
但是GPU晶片的內部互聯線長數據大家可以仔細對比。據我們了解,R600的內部互聯線長達到19000公裡,RV770到了27000公裡,如果RV770不換掉ringbus環形內存總線,線長可能要超過40000公裡,現在R800在AMD的全力改進下穩定在了36000公裡。理論上基於IC設計層面,R800還可以繼續擴展規模,但是實際操作中幾乎已經不可能了。IC設計中,不是電晶體多內部互聯線長就會過度,要看晶片具體結構,大量重複的單元才會導致線長急劇放大。
內部互聯線長對晶片互聯層數提出了極高要求,ATI一味增加GPU重複單元(流處理器)的做法,導致AMD手頭已經沒有繼續上攻互聯層的技術儲備了,目前是9/14,既邏輯互聯層為9,物理互聯層為14。
AMD自R600時代開始重複單元急劇膨脹
而NVIDIA的晶片規模一直較大,卻擁有各種複雜的非重複單元,最後使得碩大的GT200晶片擁有不到20000公裡的內部互聯線長,這個值小於AMD目前最大的GPU核心R800隻是和曾今的R600差不多,N卡的互聯線長平均只有同代A卡的60%。Fermi的具體數據尚不得而知,但是我們根據GPU內部單元設置,推測在線長方面Fermi沒有障礙。
最終的晶片面積方面,R800核心面積334mm2,FermiGF100核心面積576mm2,新工藝的啟用使得兩者都比不上55nm工藝的GT200b大。更稀鬆的晶片布局使得Fermi沒有挑戰到半導體工藝的物理極限,同時對供電的需求並不算太高,較大體積的晶片,唯一需要挑戰的就是最終良品率。
Fermi架構面臨的大晶片問題
大個頭的Fermi架構面臨的問題是完全不可迴避的。如上圖所示,根據BSN原來的估計,每片300mm晶圓所能產出的GF100最大片數為130片。不過後來他們得知GF100晶片的真實尺寸為24x23.9mm(或24x24mm),這個數值據稱與65nm製程的GT200 GPU核心尺寸完全一樣,面積均為570平方毫米。這樣經過計算,每片300mm晶圓上能產出的最大GF100片數為94個。
GF100在A1步進位程時,每片300mm晶圓上產出的合格GF100晶片只有9片,也就是說良率僅不足10%,A2步進位程的出臺便順理成章了,不過據BSN掌握的消息顯示,A2步進的良率大約是25%左右,也就是說每片300mm晶圓能產出24-26片合格晶片,這樣每片晶片的價格在208美元左右,這種價格已經接近兩片AMD Cypress晶片R800核心的價格。目前上市的則是A3製程的Fermi核心,良品率進一步提升,但價格還是明顯高於R800晶片。我們分析得出Fermi雖然沒有挑戰半導體工藝極限,但是至今還是受成本壓制,如果良品率不能得到有效提升,NVIDIA很難將投入產出比最大化。
聚焦未來GPU發展方向
從SIGGRAPH 2003大會首先提出GPU通用計算概念,到NVIDIA公司2007年推出CUDA平臺,再到今天Fermi架構面向通用計算領域設計。越來越多的信號告訴我們,GPU通用計算是一片正在被打開的潛力巨大的市場。
GPU通用計算目前遇到的最大障礙,其實來自GPU一貫的架構設計。由於GPU無法擺脫傳統的圖形加速器身份,而圖形領域SIMD和VLIW是數據並行性和操作並行性的典型結構。
●SIMD架構的尷尬
SIMD適合多媒體中的分組數據流,通過特定算法將長的數據流截成定長短向量序列,從而可以和向量處理器那樣實現對定長短向量序列的高效處理。VLIW具有的優點是:指令操作域定長,解碼簡單;適合流水處理,減少CPI;編譯器需要開發程序潛在的指令級操作並行性。VLIW指令字較長,而SIMD具有很強的數據壓縮能力。事實上,傳統觀點一直認為VLIW和SIMD技術相結合可以獲得更高的性能加速比,且非常適合多媒體數據處理。
AMD與NVIDIA的GPU流處理器單元對比
AMD從R600核心開始,一直延續著上述理念設計GPU產品,R600身上有很多傳統GPU的影子,其Stream Processing Units很像上代的Shader Units,它依然是傳統的SIMD架構。這些SIMD架構的5D ALU使用VLIW技術,可以用一條指令完成多個對數值的計算。
由於內部的5個1D ALU共享同一個指令發射埠,因此宏觀上R600應該算是SIMD(單指令多數據流)的5D矢量架構。但是R600內部的這5個ALU與傳統GPU的ALU有所不同,它們是各自獨立能夠處理任意組合的1D/2D/3D/4D/5D指令,完美支持Co-issue(矢量指令和標量指令並行執行),因此微觀上可以將其稱為5D Superscalar超標量架構。
SIMD雖然很大程度上緩解了標量指令執行效率低下的問題,但依然無法最大限度的發揮ALU運算能力,尤其是一旦遇上循環嵌套分支等情況,SIMD在矢量處理方面高效能的優勢將會被損失殆盡。同時VLIW的效率依賴於指令系統和編譯器的效率。SIMD加VLIW在通用計算上弱勢的原因就在於打包發送和拆包過程。
●MIMD架構的改進
NVIDIA從G80開始架構作了變化,把原來的4D著色單元徹底打散,流處理器不再針對矢量設計,而是統統改成了標量運算單元。每一個ALU都有自己的專屬指令發射器,初代產品擁有128個這樣的1D運算器,稱之為流處理器。這些流處理器可以按照動態流控制智能執行各種4D/3D/2D/1D指令,無論什麼類型的指令執行效率都能接近於100%。
AMD所使用的SIMD架構流處理器,具有非常明顯的優勢就是執行全4D指令時簡潔高效,對電晶體的需求量更小。而NVIDIA為了達到MIMD流處理器設計,消耗了太多電晶體資源,同時促使NVIDIA大量花費電晶體的還有龐大的線程仲裁機制、埠、緩存和寄存器等等周邊資源。NVIDIA為了TLP(線程並行度)付出了太多的代價,而這一切代價,都是為了GPU能更好地運行在各種複雜環境下。
●NVIDIA遇到的障礙
TLP線程並行度的設計方向是近年來NVIDIA公司GPU設計的主要目標。展望未來GPU發展,以下幾個問題是必須解決的。首先是分支預測能力,GPU需要擁有更好的分支能力,才能運行更多複雜程序,更好的利用cache來掩蓋分支的延遲;然後是更大的緩存和Shared memory(AMD稱之為LDS ,Local Data Share),這種共享寄存器負責共享數據和臨時掛起線程,容量越大,線程跳轉和分支能力就越強;線程粒度同樣重要,粒度越細能夠調用並行度來進行指令延遲掩蓋的機會越大,性能衰減越小。細化粒度對GPU的線程仲裁機制要求很大;同時大容量緩存的可讀寫性也是必須具備的……
除此之外實現更高水平的通用計算還有很多棘手的問題,現在它們已經被擺到NVIDIA面前。NVIDIA沿著自己設定的方向,卻用自己的產品打開了GPU領域的「潘多拉魔盒」,Fermi架構到底該如何看待,更是帶給業界前所未有的思考。
2009年在加州聖荷西召開的NVIDIA發者大會上美國橡樹嶺國家實驗室宣布一項新超級計算機計劃,將用來研究能源與氣候變遷,速度可望比目前最快的超級電腦更快十倍。其將採用的正是NVIDIA整合30億個電晶體的GPU——「Fermi」架構GF100。
橡樹嶺的電腦與運算科學實驗室副主任Jeff Nichols在聲明中表示:Fermi GPU可促成以往不可能實現的「重大科學突破」。他說:「藉由NVIDIA的技術支持,橡樹嶺能創造一個能提供億億次(exascale,10的18次方)運算的運算平臺。」億億次運算是超越目前千兆次(petaflop)運算1,000倍的技術,達到每秒100萬兆次運算。此後又有消息稱NVIDIA將和微軟合作,開發使用Tesla高性能計算卡的基於Windows HPC Server 2008平臺的集群伺服器。這些信號都標誌著NVIDIA已經正式進入超級計算機市場。
美國橡樹嶺國家實驗室關於Fermi混合運算架構的研究
Fermi的分支能力雖然得到增強,但它依然不是分支預測,而是分支論斷(predication),這一步的提升在以前是不敢想像的。在Fermi中為這一功能的初步實現提供了一個獨立單元,它和仲裁器、Atomic單元的地位一樣重要。分支論斷只能算是分支預測的雛形或前身,需要的硬體開銷的也較小,但這還是給NVIDIA帶來了很多難題。
更大的緩存更是遙不可及,無論是Shared memory還是cache,這些緩存空間的提升需要半導體工藝的強大支持,因為這部分緩存和CPU一樣使用6T SRAM電晶體,SRAM的每一個比特位需要佔用6個電晶體,存儲密度較低,1MB容量的二級緩存就需要佔用5000萬個電晶體,這是一個相當驚人的數字。
緩存的可讀寫性帶來了很多問題,它包括緩存一致性協議,緩存的命中率等問題,這些問題每年要消耗Intel和AMD等CPU製造公司很多研發力量,而Fermi的誕生,只能把NVIDIA也牽連進來。
面對前方無盡的障礙和難題,我們似乎有些悲觀,其實大可不必這樣,GPU發展到今天,已經突破了無數技術屏障,雖然你很難想像一個最初因圖形處理而誕生的硬體,今天竟然成為大規模並行計算領域的明星,但事實就是這樣。NVIDIA花費巨大精力設計出的Fermi架構不但為NVIDIA打開了通用計算領域更廣闊的空間,帶來了可觀的利潤,也打開了GPU設計領域的「潘多拉魔盒」,更多以前不可想像的功能也正在GPU晶片中不斷實現。
在文章最後讓我們一起回憶文章開始時那句經典的評論:「Fermi是一款圖形處理同樣出色的並行處理器。」不用懷疑,Fermi所代表的正是未來GPU的發展方向。
———————————————————————————
本文參考文獻:
[1] NVIDIA GF100 Graphic Architecture Whitepaper GF100圖形架構白皮書
[2] NVIDIA Fermi Architecture WhitepaperFermi架構計算白皮書
[3] 零距離接觸NVIDIA GF100
[4] Fermi秘史 揭秘難產核心前生今世的故事
[5] 以處理器為目標 NVIDIA全新Fermi架構解析
[6] DX11先鋒 ATI HD 5870震撼視覺超詳解
[7] NVIDIA Fermi 體系架構技術預覽
[8] BSN:Nvidia GF100 Fermi晶片成本分析
[9] 流處理器緣何差6倍A-N GPU架構解析