GPU通用運算大致上可以分為幾個時期。
1999-2006年「醞釀期」:微軟DirectX 8制定的著色器架構型 (Shader Model),讓GPU具備可程式化能力,也讓當時不務正業的NVIDIA,在NV30踢了大鐵板,平白送給ATI趁勢崛起的機會。但不可否認,NV30的CineFX的確算是其後來GPGPU的濫觴,依舊不能不肯定其價值。
2006-2009年「開創期」:微軟DirectX 10的統一著色器架構 (Unified Shader) 強化了GPU的使用彈性,並以NVIDIA G80為起點,GPU均走向兼具SIMD與MIMD部份優點的SIMT運算架構,千絲萬縷的執行緒灌入被拆散的龐大運算單元。
2009-2010年「熟成期」:因微軟DirectX 11,GPU開始支援IEEE 754浮點格式,無論單倍還是雙倍精度的浮點乘積和,都成為標準配備,而記憶體ECC等糾錯機制,也提昇了GPU的可靠性,讓GPU更加接近CPU,也更適合導入高效能運算 (HPC)。
2010-2016年「實用期」:GPU雙雄一同黏死在台積電28nm製程,但這段期間CUDA、OpenCL、OpenMP與OpenACC等應用程式界面也開始成熟,克服GPU記憶體容量限制的共用虛擬記憶器,也在這時開始萌芽。
2016年開始「邁向人工智慧」:為了強化GPU較弱的「推論」與節約記憶體及儲存開銷,開始支援FP16 Int8等低精度資料格式,並擴充專屬功能單元與指令。此外,普遍導入HBM2記憶體,並引進新型匯流排,如NVLink。
但放眼「高效能運算」與「人工智慧」兩塊領域,GPGPU至今也仍存在諸多限制:
高效能運算:記憶體頻寬繼續鬧飢荒。
科科也許當下無法接受為何GPU「頻寬不夠」,GDDR5X和HBM2不是都高的嚇人嗎?但如果以每個浮點運算能夠分配到的理論頻寬,GPU其實是持續下滑中的,這也導致GPU越來越仰賴共享式區域記憶體與快取記憶體。眼尖的科科一定會注意到筆者暗藏在首篇文章比較表中的伏筆。
以NVIDIA Tesla K80為例,其倍精度浮點運算理論效能是2.91TFlop,記憶體理論頻寬為480GB/s,平均為0.165 Byte / Flop;反觀更加先進的Tesla P100,理論效能5.3TFlop,HBM2記憶體提供732GB/s理論頻寬,反而是更低的0.136Byte / Flop,V100更降低到0.12 Byte / Flop。所以說,千萬不要傻傻的以為有HBM2就天下無敵,記憶體頻寬旱災的問題可大條了,支撐那些向量超級電腦的技術可一點都不簡單。
人工智慧:面對專用晶片的挑戰。
NVIDIA之所以能夠在跟AMD的多年纏鬥中勝出,說穿了,也就是因為讓消費性產品和高階專業應用分而治之,善盡其在遊戲市場維持卓越的責任,而AMD就無所不備則無所不寡的兩頭皆空。
但即使如此,GPU仍扛了太多人工智慧壓根兒不需要的繪圖功能,否則Google也不會大費周章的去打造自己的TPU。在以前,透過龐大的個人電腦市場攤平研發成本、降低價格,是GPU 邁向通用運算 (以及進攻伺服器市場的x86 CPU) 的根本優勢之所在,但現在反過來變成了多餘的包袱。所謂「資產」和「包袱」就像硬幣的兩面,大概就是這個意思。
最後,為了滿足各位科科的求知慾,筆者特此整理繪圖硬體技術的里程碑,希望可以趁機喚醒各位科科珍貴的童年回憶。謝謝收看,我們下次再見。科科。