可編程解決的是什么問題呢?主要是靈活性問題。早期的顯卡架構(gòu)以固定功能硬件為核心,將圖形學(xué)中的渲染流程分解為多個(gè)固定階段,并為每個(gè)階段設(shè)計(jì)專門的硬件模塊。這種設(shè)計(jì)雖然高效,卻也限制了開發(fā)者的靈活性,因?yàn)槌绦騿T只能利用顯卡廠商提供的預(yù)設(shè)功能,按部就班地完成渲染任務(wù),無法實(shí)現(xiàn)更或個(gè)性化的效果。
隨著3D游戲快速發(fā)展,開發(fā)者對更復(fù)雜的光照、陰影、紋理映射等效果產(chǎn)生了需求,之前的完全硬件固化的渲染管線就顯得不夠靈活了。于是,可編程渲染的想法應(yīng)運(yùn)而生,就是讓開發(fā)者直接參與顯卡渲染流程的控制,設(shè)計(jì)個(gè)性化的圖形效果。為了應(yīng)對這種技術(shù)趨勢,英偉達(dá)做出了一個(gè)意義重大的決定:讓顯卡從傳統(tǒng)的固定管線升級為支持可編程著色器的架構(gòu)。這個(gè)決定好比把傳統(tǒng)自動(dòng)咖啡機(jī)升級為一個(gè)開放式的咖啡機(jī)。傳統(tǒng)的咖啡機(jī)只能做固定的預(yù)設(shè)飲品(如拿鐵、美式),而開放式的咖啡機(jī)允許用戶自定義制作咖啡的方式,比如選擇咖啡豆量、控制研磨時(shí)間以及調(diào)整牛奶或水的比例。
可編程著色器也是類似的道理,游戲開發(fā)的程序員能更自由地利用顯卡的強(qiáng)大計(jì)算能力實(shí)現(xiàn)自己想要的渲染效果。然而,引入可編程的著色器意味著必須犧牲利潤以建設(shè)基礎(chǔ)設(shè)施,而且,不一定有太多游戲開發(fā)者采用。但英偉達(dá)當(dāng)時(shí)的技術(shù)專家戴維·柯克極力勸說黃仁勛必須支持可編程著色器:“要干這個(gè),短期內(nèi)會(huì)增加一些成本,但隨后,人人都會(huì)渴望擁有它,人人都想追趕我們。”黃仁勛起初對此持懷疑態(tài)度。然而,當(dāng)他開始權(quán)衡不引入著色器的潛在成本時(shí),他逐漸被說服。
![]()
從2001年起,英偉達(dá)開始逐步引入支持可編程著色器的顯卡芯片。這些顯卡允許程序員對頂點(diǎn)著色器、片段著色器(Fragment Shader)和幾何著色器(Geometry Shader)等編寫程序,以控制渲染流程的每個(gè)階段。我把他們發(fā)布的產(chǎn)品年表放在文稿里,感興趣的朋友可以查看。
-2001年,NVIDIA GeForce 3X是第一款支持可編程頂點(diǎn)著色器的芯片。-2003年,NVIDIA發(fā)布GeForce FX,繼續(xù)增加了可編程的像素著色器模塊。此外,頂點(diǎn)著色器增加了分支控制能力,同時(shí)支持靜態(tài)和動(dòng)態(tài)流控制。-2004年,伴隨著NVIDIA GeForce 6X的發(fā)布,頂點(diǎn)著色器和像素著色器都實(shí)現(xiàn)了完全的可編程性。-2006年,NVIDIA發(fā)布了GeForce 8系列,這是首個(gè)支持幾何著色器(Geometry Shader)可編程模塊的顯卡。從1999至2006年的7年間,英偉達(dá)終于把多個(gè)可編程模塊集齊,使得他們的顯卡成為首個(gè)支持多種3D渲染語言的架構(gòu)平臺(tái)。這進(jìn)一步極大地提高了顯卡的靈活性,能設(shè)計(jì)出更加復(fù)雜和個(gè)性化的3D圖形效果。
然而,這種可編程的靈活性不是沒有代價(jià)的。且不說額外的成本,單讓開發(fā)者使用都不是一件容易的事情。為了讓更多人能用上可編程顯卡,英偉達(dá)在2002年推出了專門的3D編程語言——Cg,全稱“C for Graphics”。他們還開發(fā)了一本《Cg教程》,手把手教你怎么用Cg做出各種炫酷的圖形效果。但是,盡管工具和教程都有了,學(xué)習(xí)成本還是太高。圖形開發(fā)本身就涉及復(fù)雜的數(shù)學(xué)原理,再加上要學(xué)新語言,推廣起來很困難。英偉達(dá)在這一時(shí)期的股價(jià)一度低迷。
黃仁勛當(dāng)時(shí)支持把固定管線變成可編程的主要原因,是為了滿足未來游戲開發(fā)者的個(gè)性化需求。但是他還有一個(gè)想法,就是“可編程”這種靈活性,可以讓那些游戲設(shè)計(jì)師之外的人也有機(jī)會(huì)使用英偉達(dá)的顯卡做些計(jì)算,從而為自己的產(chǎn)品找到新的應(yīng)用場景。注意,這是一個(gè)后續(xù)影響很重大的想法。從2001年英偉達(dá)推出GeForce 3系列開始,一些科學(xué)家和工程師就開始琢磨:能不能用這些可編程顯卡來解決我們領(lǐng)域的計(jì)算問題?這就是后來所說的GPU通用計(jì)算(General-Purpose computing on Graphics Processing Units),簡稱 GPGPU。
在2003年,兩個(gè)研究團(tuán)隊(duì)發(fā)表了兩篇重要論文,驗(yàn)證了可以用某些方法對顯卡編程,解決矩陣相關(guān)的計(jì)算,并且速度可以比普通CPU要快得多。矩陣計(jì)算是諸多科學(xué)領(lǐng)域中的核心計(jì)算。很多復(fù)雜的數(shù)學(xué)模型、物理系統(tǒng),或者處理大量數(shù)據(jù)的算法的底層原理,都可以用矩陣運(yùn)算統(tǒng)一表述。舉個(gè)例子,像流體流動(dòng)、熱傳導(dǎo)或電磁場這樣的復(fù)雜現(xiàn)象,會(huì)被轉(zhuǎn)化成涉及許多變量和方程的數(shù)學(xué)模型,而這些模型通常用矩陣來表示,再通過計(jì)算矩陣來找到問題的解。
為什么顯卡對于矩陣計(jì)算很適合呢?因?yàn)榫仃囍械拿總€(gè)元素計(jì)算通常是獨(dú)立的,可以同時(shí)并行處理。而顯卡本來就是為了處理像素設(shè)計(jì)的,每個(gè)像素的處理也是獨(dú)立的,所以天然適合這種大量并行的任務(wù)。但有個(gè)問題,當(dāng)時(shí)的顯卡完全是為圖形渲染設(shè)計(jì)的,要用來做矩陣計(jì)算得“曲線救國”。你得把矩陣計(jì)算任務(wù)包裝成渲染任務(wù),最終,GPU輸出的“渲染結(jié)果”實(shí)際上就是你想要知道的矩陣運(yùn)算的結(jié)果。
這就像你想用洗碗機(jī)洗蔬菜。洗碗機(jī)本來是洗碗的,但你可以把蔬菜裝在籃子里或小型篩網(wǎng)里再放進(jìn)去,關(guān)掉洗滌劑,也能達(dá)到清洗的目的。然而,這種曲線救國的方式不僅效率不高,而且對開發(fā)者的要求極高。開發(fā)者不僅需要完全掌握能夠?qū)PU進(jìn)行編程的應(yīng)用程序接口(API,例如OpenGL、DirectX或者英偉達(dá)的那個(gè)Cg語言),而且需要對GPU的底層極為熟悉。那么,如何降低編程的難度,讓普通程序員更好地利用GPU來實(shí)現(xiàn)自己除了圖像渲染以外的任務(wù),就是一個(gè)很重要的問題。2000年左右,斯坦福大學(xué)計(jì)算機(jī)圖形學(xué)專業(yè)的博士生伊恩·巴克(Ian Buck)也在思考如何將英偉達(dá)的顯卡用到其他領(lǐng)域的計(jì)算中。
他拿到了美國國防部的資金支持,組了個(gè)團(tuán)隊(duì),在2003年推出了“Brook”。Brook提供了更簡單的編程接口,把復(fù)雜的GPU圖形編程操作包裝成便捷的并行計(jì)算工具。有了Brook,科學(xué)家們可以用更簡單的代碼來做并行計(jì)算,開始嘗試用顯卡做天氣模擬、金融建模、醫(yī)學(xué)成像等各種計(jì)算密集型任務(wù)。
這種新型客戶的涌現(xiàn),黃仁勛也注意到了。2004年巴克博士畢業(yè)后,黃仁勛立刻邀請巴克加入英偉達(dá),開始了一個(gè)秘密項(xiàng)目,這就是統(tǒng)一著色器。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.