本部分將深入研究典型的 GPU 架構(gòu),以揭示它的局限性以及如何將它們應(yīng)用于各種算法和工作負(fù)載。
SIMT ALU 陣列
圖 1 給出了典型的 GPU 方框圖。通用 GPU 計(jì)算功能的核心是大型的算數(shù)邏輯單元 (ALU) 或內(nèi)核陣列。這些 ALU 通常被認(rèn)為是單指令多線程 (SIMT),類似于單指令多數(shù)據(jù) (SIMD)。
圖 1:GPU 方框圖
基本原理是將工作負(fù)載分成數(shù)千個(gè)并行的線程。需要大量 GPU 線程來防止 ALU 閑置。然后,對(duì)這些線程進(jìn)行調(diào)度,以使 ALU 組并行執(zhí)行同一(單個(gè))指令。利用 SIMT,GPU 廠商能實(shí)現(xiàn)相對(duì) CPU 占位面積更小和能效更高的方案,因?yàn)閮?nèi)核的很多資源都可與相同組中的其他內(nèi)核共享。
然而,顯然只是特定的工作負(fù)載(或部分工作負(fù)載)能被高效映射到這種大規(guī)模并行架構(gòu)中。如果構(gòu)成工作負(fù)載的線程不具有足夠的共性或并行性(例如連續(xù)工作負(fù)載或適度并行工作負(fù)載),則 ALU 會(huì)閑置,導(dǎo)致計(jì)算效率降低。此外,構(gòu)成工作負(fù)載的線程預(yù)期要最大化 ALU 利用率,從而產(chǎn)生額外的時(shí)延。即使有英偉達(dá)的 Volta 架構(gòu)中的獨(dú)立線程調(diào)度這樣的功能,底層
架構(gòu)也保持 SIMT,也需要大規(guī)模并行工作負(fù)載。
對(duì)于連續(xù)、適度并行或稀疏工作負(fù)載,GPU 提供的計(jì)算功能和效率甚至低于 CPU。例如用 GPU 實(shí)現(xiàn)稀疏矩陣計(jì)算;如果非零元素?cái)?shù)量較少,則從性能和效率角度看 GPU 低于或等同于 CPU。有趣的是,很多研究人員正在研究稀疏卷積神經(jīng)網(wǎng)絡(luò),以利用很多卷積神經(jīng)網(wǎng)絡(luò)中的大規(guī)模冗余。這種趨勢(shì)顯然
在機(jī)器學(xué)習(xí)推斷領(lǐng)域向 GPU 提出了挑戰(zhàn)。稀疏矩陣計(jì)算也是大數(shù)據(jù)分析中的關(guān)鍵環(huán)節(jié)。
包含大量并行計(jì)算任務(wù)的大多數(shù)工作負(fù)載也包含一些連續(xù)或適度并行元素,意味著需要 GPU-CPU 混合系統(tǒng)來滿足系統(tǒng)性能要求。顯然,高端 CPU 需求會(huì)影響平臺(tái)的效率和成本效益,CPU 與 GPU 之間的通信也會(huì)給系統(tǒng)增加潛在瓶頸。
SIMT/GPU 架構(gòu)的另一個(gè)局限性是 ALU 的功能取決于它的固定指令集和所支持的數(shù)據(jù)類型。