【SneezryLee的回答(72票)】: GPU是一群小學(xué)生,,扎堆算加減法,;CPU是一個(gè)老教授,能解微積分,。CPU的核比GPU復(fù)雜得多呢,。 【知乎用戶(hù)的回答(54票)】: 這是一個(gè)很有意思的話(huà)題。
NVIDIA Kepler GPU里面有十幾個(gè)SMX,每個(gè)SMX的組成結(jié)構(gòu)如上圖,,內(nèi)含192個(gè)處理單精度數(shù)據(jù)的CUDA Core,,2000+核心就是SMX的數(shù)量 * 每個(gè)SMX內(nèi)部的CUDA Core數(shù)量得出的。 問(wèn)題就在這里,,現(xiàn)在的GPU可以被看做是基于Streaming Processor的眾核架構(gòu),,這里的“核心”,其量級(jí)是跟多核CPU里面的“核心”完全不可同日而語(yǔ)的,。 CPU和GPU的核心用途完全不同,,不是很好比較,我想了一下覺(jué)得可以用SIMD的角度來(lái)分析一下,。NVIDIA所說(shuō)的CUDA核心其實(shí)只負(fù)責(zé)執(zhí)行SIMD中的一個(gè)line,許多個(gè)CUDA Core才能構(gòu)成一個(gè)完整的SIMD陣列,。
這是Kepler前代——Fermi的CUDA核心,。一個(gè)CUDA Core負(fù)責(zé)SIMD的一個(gè)line這是Kepler前代——Fermi的CUDA核心。一個(gè)CUDA Core負(fù)責(zé)SIMD的一個(gè)line 而CPU核心里面的SIMD部件其實(shí)是一個(gè)完整的SIMD陣列,,反觀(guān)GPU,,許多個(gè)CUDA Core才能構(gòu)成一個(gè)完整的SIMD陣列。 但是這樣比也有問(wèn)題,,SIMD陣列的寬度是不一樣的,,以現(xiàn)在256bit 寬度的CPU內(nèi)部SIMD為例,如果以32位單精度數(shù)字為一個(gè)line,,那么就可以跑8個(gè)line,,雙精度的話(huà)是4個(gè)line。相比之下NVIDIA 的CUDA核心只是負(fù)責(zé)一個(gè)line,,而SMX可以同時(shí)跑192個(gè)單精度line,,64個(gè)雙精度line 從這個(gè)角度我們可以給核心的量級(jí)做一個(gè)排序。NVIDIA SMX > CPU Core > CUDA Core 把CUDA Core與CPU Core相提并論是不對(duì)的,?!昂诵摹笔且粋€(gè)很模糊的概念,有的核心大,,有的核心小,,而且功能不同,單純比較核心數(shù)目是沒(méi)有什么意思的,,就像比較飛機(jī)發(fā)動(dòng)機(jī)數(shù)目和火車(chē)發(fā)動(dòng)機(jī)數(shù)目一樣,,關(guān)公戰(zhàn)秦瓊。以上拿SIMD寬度說(shuō)事,,只為給出一個(gè)感性理解,。 我個(gè)人很喜歡GPU和CUDA,當(dāng)時(shí)買(mǎi)筆記本很有遠(yuǎn)見(jiàn)地買(mǎi)了帶Geforce的,但NVIDIA宣傳GPU和CUDA的時(shí)候,,有些地方可能不是很恰當(dāng),,比如把SIMD的一個(gè)line包裝成CUDA Core,把一次SIMD操作改稱(chēng)為Warp之類(lèi),,頗有誤導(dǎo)性,,我也是看了最新版的量化才恍然大悟。 ====================================================================== 更新1. 上面這句說(shuō)“一次SIMD操作改稱(chēng)為Warp”是錯(cuò)誤的,,一個(gè)warp是一組CUDA線(xiàn)程的集合,,warp內(nèi)部在沒(méi)有分支的情況下同步執(zhí)行指令。抱歉我讀CUDA已經(jīng)是一年前,,有些概念生疏了,。NV所出的兩本CUDA書(shū)我都從頭到尾讀過(guò),Stackoverflow上也有我貼出,、被選為最佳答案的CUDA代碼,,自信理解本質(zhì)無(wú)問(wèn)題。感謝評(píng)論區(qū)中張亞,、張揚(yáng)二位提醒,。 更新2. GPU核心和CPU核心并無(wú)可比性是毋庸置疑的,但是我認(rèn)為單純給出一個(gè)“并無(wú)可比性”的論斷也沒(méi)有多大意義,,無(wú)助于理解本質(zhì)所在,。GPU VS CPU的區(qū)別可以從很多角度來(lái)看,SIMD只是其中之一,,希望看到其他人貢獻(xiàn)更多好的回答,。 ==================================================================== 更新3. 下面這段文字嘗試從微結(jié)構(gòu)演化的角度來(lái)分析對(duì)比GPU和CPU,摘自我給某紙媒寫(xiě)的一篇專(zhuān)欄,,貼在這里當(dāng)拋磚引玉吧,。GPU的演化除了從微結(jié)構(gòu)角度看以外,圖形學(xué)也是不可忽視的一個(gè)驅(qū)動(dòng)因素,,這部分我不是很熟,,希望有人能出來(lái)寫(xiě)一個(gè)好答案。 翻閱上世紀(jì)八十年代末期至九十年代中期的論文,,便不難發(fā)現(xiàn),,當(dāng)時(shí)學(xué)術(shù)界與工業(yè)界熱衷于具備寬發(fā)射、長(zhǎng)流水,,亂序執(zhí)行,、分支預(yù)測(cè)能力的CPU,認(rèn)定這將是未來(lái)的發(fā)展方向,,這些技術(shù)的研究熱火朝天,,有的學(xué)者甚至樂(lè)觀(guān)地展望,未來(lái)將出現(xiàn)每周期15發(fā)射以上的驚人前端發(fā)射寬度,這樣激進(jìn)的寬發(fā)射CPU當(dāng)然并未成為現(xiàn)實(shí),,作為對(duì)比,,Haswell架構(gòu)的發(fā)射寬度為4(因?yàn)榭梢园l(fā)射融合微指令,所以實(shí)際等效發(fā)射寬度稍高),,安騰2架構(gòu)在編譯器調(diào)度的幫助下也只能做到12發(fā)射,。這種樂(lè)觀(guān)預(yù)期的存在很好地反映了當(dāng)年的時(shí)代局限。九十年代微架構(gòu)設(shè)計(jì)的主流觀(guān)點(diǎn)是,,若想提高計(jì)算速度,,加強(qiáng)CPU核心的執(zhí)行能力是重點(diǎn)。在這樣的指導(dǎo)思想下,,著名的Intel P6微架構(gòu)誕生了,,雙發(fā)射+長(zhǎng)流水+亂序執(zhí)行+分支預(yù)測(cè)一應(yīng)俱全,核心頻率越來(lái)越高,,邏輯越來(lái)越復(fù)雜,,直至NetBurst架構(gòu)的高頻奔騰4芯片折戟沉沙。 重新審視當(dāng)時(shí)的失敗原因,,主要有兩個(gè)。 其一,,功耗墻(power wall),。用以加強(qiáng)CPU核心執(zhí)行能力的這些技術(shù)將大幅推高功耗,以亂序執(zhí)行為例,,每一條指令的發(fā)射和執(zhí)行都需要經(jīng)過(guò)一整套邏輯的檢查以確保流程正確,,并占用額外的寄存器,這意味著每一條指令的執(zhí)行都需要更多功耗,。這種愈發(fā)激進(jìn)的CPU設(shè)計(jì)在Netburst架構(gòu)時(shí)代迎來(lái)頂峰,,隨后狠狠地撞上了功耗天花板。前Intel副總裁Patrick Gelsinger曾在2001年的國(guó)際固態(tài)電子電路會(huì)議上發(fā)表主題演講,,警告說(shuō)CPU的功耗密度如果繼續(xù)提高,,不出幾年就將擺脫現(xiàn)有一切冷卻手段的束縛,徹底失去控制,。更加不妙的是,,仿真結(jié)果揭示,即便傾盡全力,,給定無(wú)限多的芯片面積預(yù)算去設(shè)計(jì)一個(gè)發(fā)射寬度遠(yuǎn)超當(dāng)下,,配備極強(qiáng)的亂序執(zhí)行能力和分支預(yù)測(cè)器的CPU,其整數(shù)指令發(fā)射能力也不過(guò)提高區(qū)區(qū)幾倍,,這樣的設(shè)計(jì)思路下,,改進(jìn)潛力已經(jīng)不大。 其二,訪(fǎng)存墻(memory wall),。愈發(fā)激進(jìn)的CPU設(shè)計(jì)將CPU核心的執(zhí)行速度提得很高,,存儲(chǔ)器系統(tǒng)已經(jīng)越來(lái)越力不從心。提供足夠大的存儲(chǔ)容量和提供足夠快的響應(yīng)速度在本質(zhì)上是矛盾的,,馮諾依曼早在1945年就斷言容量和速度的需求無(wú)法同時(shí)滿(mǎn)足,,這位大師級(jí)人物不幸再度言中,存儲(chǔ)器系統(tǒng)越來(lái)越難以用足夠快的速度交付和接受指令與數(shù)據(jù),,引發(fā)了架構(gòu)設(shè)計(jì)者們的擔(dān)憂(yōu),。DEC公司Alpha架構(gòu)的首席架構(gòu)師理查德·賽特斯在1996年的《微處理器報(bào)告》上撰寫(xiě)了一篇標(biāo)題為《瓶頸在內(nèi)存,愚蠢,!》的驚世雄文,,據(jù)他披露的測(cè)試結(jié)果,當(dāng)時(shí)最出色的亂序超標(biāo)量處理器若是管線(xiàn)填滿(mǎn),,理論上每周期可以完成兩條左右的指令,,而實(shí)際執(zhí)行時(shí)每四到五個(gè)周期才會(huì)有一條指令完成,落差幾乎達(dá)到十倍,,花費(fèi)學(xué)術(shù)界與工業(yè)界無(wú)數(shù)心血研究測(cè)試的超標(biāo)量亂序執(zhí)行并未如想象中那樣強(qiáng)大,,優(yōu)勢(shì)幾成泡影。這項(xiàng)測(cè)試非常有力地證明,,整個(gè)執(zhí)行模式存在極其嚴(yán)重的瓶頸,,制約了整個(gè)CPU的性能,而這個(gè)瓶頸就在于訪(fǎng)存速度,?;ㄙM(fèi)如此大的精力設(shè)計(jì)的高性能CPU,卻花費(fèi)了90%的時(shí)間等待存儲(chǔ)器系統(tǒng)的響應(yīng),,這不能不說(shuō)是一種莫大的諷刺,。賽特斯不無(wú)悲觀(guān)地認(rèn)為,在未來(lái)的處理器微架構(gòu)設(shè)計(jì)中,,存儲(chǔ)器系統(tǒng)將成為唯一的關(guān)鍵因素,。 面對(duì)這些挑戰(zhàn),業(yè)內(nèi)已有一些較有遠(yuǎn)見(jiàn)的架構(gòu)師開(kāi)始討論另一種全新的架構(gòu)設(shè)計(jì)方式,,他們?cè)O(shè)想拋棄高能耗的復(fù)雜亂序執(zhí)行核心,,轉(zhuǎn)而采用設(shè)計(jì)精巧簡(jiǎn)單,功耗較低的小核心,,將設(shè)計(jì)重點(diǎn)放在提高對(duì)存儲(chǔ)器系統(tǒng)的延遲容忍上,,依靠多核心多線(xiàn)程并行執(zhí)行來(lái)躲避存儲(chǔ)器系統(tǒng)的延遲——這便是后來(lái)NVIDIA GPGPU的核心設(shè)計(jì)理念之一。 計(jì)算機(jī)上運(yùn)行的程序種類(lèi)繁多,,有的程序代碼包含大量分支(例如編譯器,,人工智能,,電路真值表生成),需要CPU擁有強(qiáng)大的分支預(yù)測(cè)器,,有的程序代碼頻繁取用數(shù)組元素(例如矩陣計(jì)算),,對(duì)CPU的訪(fǎng)存能力提出了很高要求,設(shè)計(jì)一個(gè)萬(wàn)能型的CPU,,要求它運(yùn)行所有種類(lèi)的代碼都能拿出最快速度,,這是極其困難的,但是如果能夠區(qū)分程序類(lèi)型,,針對(duì)性地設(shè)計(jì)多種處理單元,,令其分工合作,則有可能滿(mǎn)足所有需求,,這被稱(chēng)為異構(gòu)計(jì)算,。 在講述GPGPU的運(yùn)算優(yōu)勢(shì)之前,我們先來(lái)看看初中數(shù)學(xué)水平的簡(jiǎn)單向量加法,??紤]兩個(gè)寬度為16的向量相加,{1,,2,,3,…,,15,,16} + {1,2,,3,,…,,15,,16} = {2,4,,6,,…,30,,32},,不難發(fā)現(xiàn),其中每組對(duì)應(yīng)數(shù)字的相加,,相互之間并不干擾,,不存在相關(guān)性,而且沒(méi)有分支,,可以完美地實(shí)現(xiàn)并行,。只需讓一條加法指令同時(shí)控制十六條邏輯通路,,引導(dǎo)十六組寄存器中的數(shù)據(jù)進(jìn)入ALU,再同時(shí)寫(xiě)回寄存器,,就可以并行做完這個(gè)寬度為16的向量加法,,用體系結(jié)構(gòu)的術(shù)語(yǔ)來(lái)說(shuō),這被稱(chēng)為寬度為16的SIMD執(zhí)行(單指令多數(shù)據(jù)),。 研究顯示,,與此例類(lèi)似的向量計(jì)算代碼經(jīng)常出現(xiàn)在某些特定種類(lèi)的程序中(例如圖像編解碼)。因此,,這種能夠一次處理多組數(shù)據(jù)的SIMD處理單元就可以考慮作為GPGPU的基本構(gòu)建模塊,,以NVIDIA Fermi架構(gòu)的GTX 480為例,它內(nèi)部的SIMD處理單元寬度為16,,整個(gè)核心擁有16個(gè)這樣的處理單元,,一個(gè)時(shí)鐘周期就能完成256 FLOPS的運(yùn)算量,這個(gè)并行計(jì)算的寬度是驚人的,,但是強(qiáng)大的并行能力背后需要寄存器或者存儲(chǔ)器系統(tǒng)的支持,。如果每個(gè)操作數(shù)都由內(nèi)存提供,那么每進(jìn)行一次單精度計(jì)算都需要內(nèi)存系統(tǒng)提供2KB數(shù)據(jù),,顯然這是難以達(dá)到的,。如此大的訪(fǎng)存壓力需要使用其他技術(shù)進(jìn)行分?jǐn)偂?/p> 因此,GPGPU通常具備數(shù)量龐大的通用寄存器組,,盡量使數(shù)據(jù)保存在本地,,同時(shí)每個(gè)SIMD處理單元都具備多線(xiàn)程的硬件支持,例如Fermi的每個(gè)SIMD內(nèi)部都設(shè)立了一個(gè)包含48線(xiàn)程的調(diào)度表,,能夠在當(dāng)前線(xiàn)程發(fā)生訪(fǎng)存停頓時(shí)迅速切換至其他線(xiàn)程,,通過(guò)多個(gè)線(xiàn)程的重疊執(zhí)行來(lái)隱藏訪(fǎng)存延遲。除此之外,,GPGPU的內(nèi)存控制器也支持Gather-Scatter操作,,能夠應(yīng)對(duì)部分不規(guī)則的內(nèi)存位置訪(fǎng)問(wèn),對(duì)接的內(nèi)存系統(tǒng)也是經(jīng)過(guò)特別設(shè)計(jì)以實(shí)現(xiàn)更高帶寬,。從圖中可以看出,,GPGPU的核心內(nèi)部的緩存所占面積也很小,絕大部分芯片面積都用來(lái)構(gòu)建邏輯運(yùn)算單元和數(shù)據(jù)通路,。相較之下,,CPU則依靠更大的緩存來(lái)彌補(bǔ)內(nèi)存缺憾,緩存所占芯片面積達(dá)到50%是常事,,歷史上甚至出現(xiàn)過(guò)HP8700這樣的奇葩架構(gòu),,緩存所占面積幾乎達(dá)到四分之三。 經(jīng)過(guò)這樣設(shè)計(jì)的GPGPU架構(gòu),,其控制邏輯相對(duì)簡(jiǎn)單,,一條指令便可以控制極寬的數(shù)據(jù)通路,,而數(shù)據(jù)通路可以按照需求進(jìn)行關(guān)閉,縮減功耗,,因此這種架構(gòu)能夠帶來(lái)更好的能耗表現(xiàn),,這便是架構(gòu)設(shè)計(jì)師們對(duì)功耗墻問(wèn)題所做的應(yīng)對(duì)措施之一。再來(lái)看訪(fǎng)存墻,,GPGPU的線(xiàn)程并行度很高,,來(lái)回切換線(xiàn)程的做法能更好地容忍內(nèi)存延遲,但是對(duì)內(nèi)存帶寬需求更高,,而且要求訪(fǎng)存更加局部化,。當(dāng)計(jì)算任務(wù)的相關(guān)性很弱,幾乎不存在分支,,且內(nèi)存訪(fǎng)問(wèn)模式比較規(guī)律的時(shí)候,,GPGPU能夠以更快的速度執(zhí)行完畢,這部分優(yōu)勢(shì)是GPGPU截然不同的設(shè)計(jì)思路所帶來(lái)的,,也是傳統(tǒng)CPU難以企及的,,在GPGPU上實(shí)現(xiàn)較高計(jì)算加速比的通常就是這類(lèi)程序。但是GPGPU也并非萬(wàn)能,,它處理分支的能力很弱,,目前大多依靠謂詞執(zhí)行,如果讓GPGPU來(lái)處理分支較多的程序,,SIMD單元就會(huì)在各種指令路徑間來(lái)回切換,,效率大打折扣。例如,,給定一個(gè)寬度為16的向量,,根據(jù)每個(gè)數(shù)字的奇偶性來(lái)決定執(zhí)行路徑,偶數(shù)則執(zhí)行乘法,,奇數(shù)則執(zhí)行除法,,那么就無(wú)法再依靠單一指令指揮整個(gè)向量數(shù)據(jù)流了,而這種工作在CPU上卻得心應(yīng)手,。此外,,若計(jì)算任務(wù)出現(xiàn)較強(qiáng)的相關(guān)性,,程序員就很難編寫(xiě)并行化的代碼,,這部分任務(wù)也很難在GPGPU上執(zhí)行。因此,,可以預(yù)見(jiàn)CPU+GPGPU需要在以后的時(shí)間里分工合作,,讓CPU憑借強(qiáng)大的分支預(yù)測(cè)和快速串行執(zhí)行能力來(lái)處理串行化代碼,而GPGPU處理并行化的代碼,,以這種異構(gòu)計(jì)算的方式實(shí)現(xiàn)更高的效率,,NVIDIA的CUDA編程語(yǔ)言和GPGPU執(zhí)行架構(gòu)便是基于這樣的思路設(shè)計(jì),。 【王沫陽(yáng)的回答(11票)】: “如果你要耕一塊地,你愿意用 2 頭牛還是 1024 只雞呢,?” ——引自 Computer Architecture, A Quantitative Approach 【KillConsole的回答(3票)】: GPU的核和CPU的核是兩回事,。GPU只能計(jì)算那些能并行化,數(shù)據(jù)依賴(lài)性不高的任務(wù),,而不能進(jìn)行串行化的任務(wù),,也就是計(jì)算量大但是計(jì)算不復(fù)雜的任務(wù)。 【知乎用戶(hù)的回答(0票)】: 大抵CPU要處理的程序更通用, 不是所有的程序都是全并行的啊. 程序里串行計(jì)算的部分多了,核數(shù)再多也沒(méi)用啊. 假定有50%的代碼是串行的. 那核數(shù)再多, 拿Amdahl定律算,撐死了加速比也就是2. 而且由此而來(lái)的cache一致性/interconnect的開(kāi)銷(xiāo)也越大吧. 原文地址:知乎 |
|