題 為什麼我們仍然使用CPU而不是GPU?


在我看來,這些天很多計算都是在GPU上完成的。顯然圖形是在那裡完成的,但是使用CUDA等,AI,散列算法(想想比特幣)和其他也在GPU上完成。為什麼我們不能自己擺脫CPU並使用GPU呢?是什麼讓GPU比CPU快得多?


355
2017-07-10 13:31


起源


我怎麼知道哪些答案包含正確的信息?我應該等到其他人上/下投票答案嗎?我覺得我太急於接受答案:哦 - ell
@ell現在有一些最近的答案,其中不包含“錯誤信息”。由於精心設計的StackExchange的有效市場機制,他們逐漸上升到最高票;-)我建議等待一段時間再接受答案。看起來你非常謹慎地這樣做。順便說一下,這是一個很好的問題。可能看起來很明顯,但根本不存在。謝謝你的要求! - Ellie Kesselman
有點像問“如果波音747更快,更省油,為什麼我們仍然開車”? - vartec
不,因為它不是RISC而不是CISC。它是其他計算機科學基礎之一,略有偽裝。它的 “為什麼我們將工作從中央處理器卸載到I / O處理器上?”。 - JdeBP
@vartec:我認為在公共汽車和出租車之間可能會有一個更好的類比。如果有四十個人都想從同一個地方到同一個地方,公共汽車將更加高效。如果有四十個人的理想起點和目的地廣泛分散,即使是單一的出租車也可能和公共汽車一樣好,而且對於公共汽車的成本,可能會有多個出租車。 - supercat


答案:


TL; DR回答: GPU擁有比CPU更多的處理器內核,但由於每個GPU內核的運行速度明顯慢於CPU內核,並且沒有現代操作系統所需的功能,因此它們不適合在日常計算中執行大多數處理。它們最適合計算密集型操作,如視頻處理和物理模擬。


GPGPU 仍然是一個相對較新的概念。 GPU最初僅用於渲染圖形;隨著技術的進步,GPU中相對於CPU的大量內核被開髮用於開發GPU的計算能力,以便它們可以同時處理許多並行數據流,無論數據是什麼。雖然GPU可以有數百甚至數千個流處理器,但它們每個運行速度都比CPU核心慢,並且功能較少(即使它們是 圖靈完成 並且可以編程運行CPU可以運行的任何程序)。 GPU缺少的功能包括實現現代操作系統所需的中斷和虛擬內存。

換句話說,CPU和GPU具有明顯不同的體系結構,使它們更適合於不同的任務。 GPU可以處理許多流中的大量數據,對它們執行相對簡單的操作,但不適合在單個或幾個數據流上進行繁重或複雜的處理。 CPU在每個核心基礎上更快(就每秒指令而言),並且可以更輕鬆地對單個或少數數據流執行複雜操作,但無法同時有效地處理多個流。

因此,GPU不適合處理不會顯著受益或無法並行化的任務,包括許多常見的消費者應用程序,如文字處理程序。此外,GPU使用根本不同的架構;人們必須專門為GPU設計應用程序才能使其工作,並且編程GPU需要顯著不同的技術。這些不同的技術包括新的編程語言,對現有語言的修改,以及更適合將計算表達為由許多流處理器執行的並行操作的新編程範例。有關編程GPU所需技術的更多信息,請參閱維基百科上的文章 流處理 和 並行計算

現代GPU能夠執行向量運算和浮點運算,最新的卡能夠處理雙精度浮點數。諸如CUDA和OpenCL之類的框架使得能夠為GPU編寫程序,並且GPU的性質使它們最適合於高度可並行化的操作,例如在科學計算中,其中一系列專用GPU計算卡可以是小型的可行替代品。計算集群如 NVIDIA Tesla個人超級計算機。擁有Folding @ home經驗豐富的現代GPU的消費者可以使用它們進行貢獻 GPU客戶端,它可以以非常高的速度執行蛋白質折疊模擬,並為項目貢獻更多的工作(一定要閱讀 常見問題解答 首先,尤其是與GPU相關的那些。 GPU還可以使用PhysX在視頻遊戲中實現更好的物理模擬,加速視頻編碼和解碼,以及執行其他計算密集型任務。 GPU最適合執行的是這些類型的任務。

AMD正在開創一種名為的處理器設計 加速處理單元(APU) 它結合了傳統的x86 CPU內核和GPU。這種方法使圖形性能遠遠優於主板集成圖形解決方案(雖然不能與更昂貴的獨立GPU匹配),並且可以實現具有良好多媒體性能的緊湊,低成本系統,而無需單獨的GPU。最新的英特爾處理器還提供片上集成顯卡,儘管競爭性集成GPU性能目前僅限於採用英特爾Iris Pro Graphics的少數芯片。隨著技術的不斷發展,我們將看到這些曾經獨立的部件越來越趨同。 AMD設想 CPU和GPU是一體的未來,能夠在同一任務上無縫協同工作

儘管如此,PC操作系統和應用程序執行的許多任務仍然更適合CPU,並且需要做很多工作來使用GPU加速程序。由於現有的軟件使用x86架構,並且由於GPU需要不同的編程技術並且缺少操作系統所需的幾個重要功能,因此從日常計算到CPU的GPU的一般轉換非常困難。


375
2017-07-10 14:00



就像這個答案一樣,我認為主要原因是我們沒有好的主流編程語言來處理這樣的並行架構。幾十年來我們一直在努力推進多線程編程,人們仍在呼喚,多線程“邪惡”。儘管多核CPU和GPU已經成為現實,但我們必須提出新的編程範例來解決這個問題。 - Soren
值得注意的是英特爾一直在努力 拉拉 架構(太長時間),它本質上是一個芯片,上面有大量的x86內核。 - Chris S
討論硬件原因和討論APU以及它們將如何改變這一點的絕佳答案。但是,@ Soren在軟件方面給出了非常好的觀點。實際上,它是硬件問題,軟件問題以及CPU運行的事實以及何時知道某些工作的結合,很難讓人們更換它。 - Nich Del
“我們沒有很好的主流編程語言來處理這樣的並行架構。”  - Haskell,OCaml,Scheme,F#,Erlang,以及幾乎任何其他函數式編程語言都很好地處理多線程。我提到的所有都是主流。 - BlueRaja - Danny Pflughoeft
@BlueRaja - 我們知道這些語言,你對主流的定義必須與我的不同:-) - Soren


是什麼讓GPU比CPU快得多?

GPU是  比CPU快。 CPU和GPU設計有兩個不同的目標,有不同的權衡,所以他們有 不同 性能特徵。某些任務在CPU中更快,而其他任務在GPU中計算得更快。 CPU擅長對一小組數據進行複雜的操作,GPU擅長對大量數據進行簡單操作。

GPU是一種專用CPU,其設計使得單個指令可以在大塊數據(SIMD /單指令多數據)上工作,所有這些指令都應用相同的操作。在數據塊中工作肯定比一次使用單個單元更有效,因為解碼指令的開銷大大減少,但是在大塊中工作意味著有更多的並行工作單元,因此它使用了更多的晶體管實現單GPU指令(導致物理尺寸限制,使用更多能量,產生更多熱量)。

CPU旨在盡快在單個數據上執行單個指令。由於它只需要使用單個數據,因此實現單個指令所需的晶體管數量要少得多,因此CPU可以承受更大的指令集,更複雜的ALU,更好的分支預測,更好的虛擬化架構,以及更複雜的緩存/管道方案。它的指令周期也更快。

我們仍在使用CPU的原因是  因為x86是CPU架構的王者而Windows是為x86編寫的,所以我們仍在使用CPU的原因是因為操作系統需要做的任務,即做出決策,在CPU架構上運行得更高效。操作系統需要查看100種不同類型的數據,並做出各自相互依賴的各種決策;這種工作不容易並行化,至少不能並行化為SIMD架構。

在未來,我們將看到CPU和GPU架構之間的融合,因為CPU獲得了處理數據塊的能力,例如, SSE。此外,隨著製造技術的改進和芯片變小,GPU可以承擔更複雜的指令。


246
2017-07-10 20:22



這可能是最好的答案。理解兩種範式之間的根本區別非常重要。考慮到今天的工作負載,GPU要超越CPU,實質上意味著GPU必須變成CPU。因此問題就是答案。 - surfasb
+1這是最好的答案。這個和接受的答案都是正確的,但是這個解釋得更清楚了。
我很驚訝在這個帖子中沒有人提到向GPU發送數據的開銷 - PCI-Express總線上的有限帶寬使得GPU上的某些並行操作比在CPU上執行的速度慢得多。可以看到一個簡單的情況,即由於發送數據,設置上下文,讀回結果的開銷,改變FFT的大小會對GPU與CPU的性能產生顯著差異: stackoverflow.com/a/8687732/303612 可以在CPU上的高速緩存中執行較小的操作,並且內存帶寬遠遠優於當前的PCI-E架構 - Dr. Andrew Burnett-Thompson
@ Dr.AndrewBurnett-Thompson:那是因為那與問題無關。目前,GPU被認為是輔助處理單元,這就是為什麼從/向GPU移動數據是必要且昂貴的原因。如果我們將GPU視為第一類處理單元,則不需要在主存儲器和GPU存儲器之間編組數據。 - Lie Ryan
不樂觀,它不是零帶寬開銷。如果具有GPU架構的處理器運行整個節目,則無需移動任何內容即GPU內存 是 主要記憶。因為沒有轉移,所以首先沒有談論轉移費用。這並不是假設,AMD的APU使用具有統一主存儲器的HSA(異構系統架構),允許在CPU和GPU之間進行零複製。 - Lie Ryan


GPU缺乏:

  1. 虛擬內存 (!!!)
  2. 尋址存儲器以外的設備的方法(例如鍵盤,打印機,二級存儲器等)
  3. 中斷

您需要這些能夠實現現代操作系統之類的任何功能。

它們在雙精度算術(與其單精度算術性能相比)*(相對)慢(並且相對)慢,並且更大(就矽的尺寸而言)。較舊的GPU體系結構不支持大多數通用編程所需的間接調用(通過函數指針),以及那些執行速度較慢的最新體系結構。最後,(正如其他答案所述),對於無法並行化的任務,與給定相同工作負載的CPU相比,GPU會丟失。

編輯:請注意,此響應是在2011年編寫的 - GPU技術是一個不斷變化的領域。根據您何時閱讀本文,情況可能會有很大不同:P

*有些GPU在雙精度算術方面並不慢,例如NVidia的Quadro或Tesla系列(Fermi代或更新版),或AMD的FirePro系列(GCN代或更新版)。但這些並不是大多數消費者的機器。


75
2017-07-10 21:17



@Cicada:你有參考嗎?在任何情況下,即使這是真的,即使是最近的硬件也不會在這種情況下表現良好。 (例如,與CPU相比,它沒有太多的優勢 - 以及功耗劣勢) - Billy ONeal
是的,如你所說的Fermi設備(使用CUDA 4.0和sm_20),支持間接跳轉(因此支持C ++虛擬方法,繼承等)。 - Angry Lettuce
544 GigaFLOPS 從300美元的2歲GPU開始很慢? - Ben Voigt
@Ben:您只能在數據並行應用程序中獲得這種性能。一般順序操作是一個完全不同的球賽。 (這只是該芯片上所有1600個內核並行運行,一遍又一遍地運行相同的指令......甚至是理論而非實際的性能) - Billy ONeal
@Billy:但是對於特定類算法來說這是緩慢的,而不是雙精度算術的慢(這是你聲稱的)。 (並且CPU通常也沒有實現基準吞吐量) - Ben Voigt


CPU就像一個超級快的工人。 GPU就像一群克隆工作者,速度很快,但是所有人都需要一致地做同樣的事情(除了你可以讓一些克隆閒置,如果你想要的話)

你寧願作為你的同伴開發者,一個超級快速的傢伙,還是100個快速克隆,實際上不是那麼快,但是所有人都必須同時執行相同的操作?

對於某些動作,克隆非常好,例如掃地 - 他們每個人都可以掃過它的一部分。

對於某些操作,克隆很臭,例如編寫每週報告 - 所有克隆,但一個克隆空閒,而一個克隆寫入報告(否則您只能獲得相同報告的100個副本)。


37
2017-07-11 15:39



我甚至可以......兩個? - Kevin Panko
@Kevin:是的,但是你需要一台電腦 都 一個CPU 和 一個GPU!如果只有這樣的事情! - Joachim Sauer
很好比喻。會記得這個。 - Mayo


因為GPU被設計為同時執行許多小事情,並且CPU被設計為一次完成一件事。如果您的過程可以大規模並行,例如散列,那麼GPU的速度要快幾個數量級,否則就不會。

你的CPU可以比GPU更快地計算哈希值 - 但是你的CPU需要花費的時間,你的GPU可以通過數百個哈希值。 GPU設計用於同時執行許多操作,並且CPU設計為一次執行一項操作,但速度非常快。

問題是CPU和GPU是針對非常不同的問題的非常不同的解決方案,存在一些重疊但通常其域中的內容保留在其域中。我們不能用GPU替換CPU,因為CPU在那裡比GPU更好地完成工作,僅僅因為GPU不是為了完成這項工作而設計的,而是CPU。

但是,如果有可能廢棄CPU並且只有GPU,那麼您是否認為我們會重命名它? :)


23
2017-07-10 17:51



我認為大多數現代CPU都可以同時執行2個,4個或8個任務。 - danielcg
@ danielcg25:大多數現代GPU都設計為一次完成256,512,1024個東西(GTX 680有 1536 CUDA核心)。每個CPU核心在概念上都是一個獨特的實體,但GPU並非如此。 - Phoshi
@ danielcg25:我知道,但如果有人在不知道這個話題的情況下閱讀它,那麼對答案的基本(雖然是故意的)誤解的評論可能是有害的。在這種意義上,“作為一個屁股”在SE上並沒有真正受到重視,因為它降低了信號:噪聲比。 - Phoshi
我只是提供了一些信息。現在大多數計算機實際上能夠同時處理2-8個東西。有些處理器甚至可以做得更多。它仍然沒有接近同時做100件事的GPU。 - danielcg
@ danielcg25:這是一種不同的處理方式,這就是問題所在。每個CPU核心都是有效的分離,使用自己的數據塊和自己的進程。每個CPU內核彼此執行不同的獨立任務,並且它們不會線性向上擴展 - 八核不是四核的兩倍,而不是雙核的兩倍。另一方面,GPU核心跨不同的數據執行相同的任務,並且線性擴展。很明顯,存在多核CPU,但是 這不是一回事。 - Phoshi


你真的在問 為什麼我們不在CPU中使用GPU架構?

GPU只是顯卡的專用CPU。我們提供GPU非圖形計算,因為通用CPU在並行和浮點執行方面都達不到標準。

我們實際上正在使用不同的(更多GPU-ish)CPU架構。例如。 尼亞加拉 處理器是多任務處理。 SPARC T3 將運行512個並發線程。


14
2017-07-10 17:57



為什麼選擇downvote? - jkj
我猜最後一行,因為它只是假的。事實上,我只能想到一個僅限x86的主流操作系統;甚至那個已被移植到alpha和ARM處理器,目前尚未商業化。 - Javier
好。刪除了我對主流操作系統支持的看法的最後一部分,阻礙了對新架構的更改。可能不在答案的範圍內。 - jkj


我在這裡可能會非常錯誤,並且在這個問題上很少或根本沒有權威,但是這裡有:

  • 我相信每個GPU執行單元(“核心”)與CPU相比具有非常有限的地址空間。

  • GPU執行單元無法有效處理分支。

  • GPU執行單元不像CPU那樣支持硬件中斷。

我一直認為GPU執行單元的方式類似於Playstation 3“SPE”,他們希望獲得一個數據塊,在其上運行一些順序操作,然後吐出另一個塊數據,沖洗,重複。它們沒有主要“CPE”那麼多的可尋址內存,但其想法是將每個“SPE”專用於特定的順序任務。一個單元的輸出可能會輸入另一個單元的輸入。

如果執行單元試圖“分析”數據並根據數據做出一系列決策,則執行單元無法正常工作。

這些“數據塊”可以是流的一部分,例如來自遊戲狀態表的頂點列表,來自磁盤的MPEG數據等。

如果某些東西不適合這種“流媒體”模型,那麼你就有一項無法有效平行化的任務,GPU不一定是最佳解決方案。一個很好的例子是處理基於鍵盤,操縱桿或網絡輸入的“外部事件”。沒有很多東西不適合這種模式,但總會有一些。


11
2017-07-10 15:55



關於分支預測優化的好點 - 我從來沒有考慮過,但你是對的。 - Jimmy Breck-McKye


這是 沒有 關於時鐘速度或目的。他們同樣能夠完成大部分(如果不是全部)任務;然而,有些稍微適合某些任務,然後其他任務。

有一個 非常 關於是否有更多愚蠢的核心或一小組非常聰明的核心更好的爭論。這很容易回到80年代。

在CPU內部,可以進行許多可能的計算。更智能的內核能夠同時執行許多不同的計算(有點像多核但不是,它很複雜;請參閱 指令級並行)。智能核心可以同時進行多次計算(加,減,乘,除,內存操作),但一次只能進行一次;因此,它們在物理上更大(因此更昂貴),然後是硬核。

啞芯非常小,因此可以將更多內核添加到單個芯片中,但不能同時進行多次計算。許多啞芯和一些智能核心之間存在良好的平衡。

多核架構可以很好地與圖形配合使用,因為計算可以很容易地分成幾百個核心,但它還取決於代碼的質量以及其他代碼是否依賴於一次計算的結果。

這是一個 許多 比它看起來更複雜的問題。有關更多信息,請閱讀有關CPU設計的文章:

現代微處理器 - 90分鐘指南

http://www.lighterra.com/papers/modernmicroprocessors/


6
2017-07-12 04:36



請原諒可憐的語法和上面使用的一般低於標準的寫作風格,我沒有喝咖啡。它是一個相當複雜的概念,如果你想了解更多,你應該去的地方包含鏈接。不是我的壞解釋 - Silverfire
我已經為你修好了,並添加了一個鏈接。 - bwDraco