2011-08-17 117 views
16

我知道GPU比CPU快得多的例子。但存在很難平行的算法(問題)。你可以給我一些例子或測試時,CPU可以克服GPU?cpu vs gpu - CPU好時

編輯:

感謝您的建議!我們可以比較最流行的和最新的CPU和GPU,例如Core i5 2500k和GeForce GTX 560 Ti。

我想知道如何比較它們之間的SIMD模型。例如:Cuda更精確地稱爲SIMD模型。但是SIMT應該與在多核處理器內核之間分配線程(任務)的CPU進行多線程比較(Core i5 2500k給出4個MIMD內核)。另一方面,這些MIMD內核中的每一個都可以實現SIMD模型,但這不是SIMT,我不知道如何比較它們。最後一個併發內核執行的費米體系結構可能被認爲是SIMD的MIMD核心。

+1

請仔細閱讀[這篇博客] (http://blog.stackoverflow.com/2011/08/gorilla-vs-shark/),然後在stackoverflow上提出任何類似問題。 – talonmies 2011-08-17 11:26:20

回答

15

根據我的經驗,我將總結CPU和GPU中並行程序在性能方面的主要差異。相信我,一代一代的比較可以改變。所以我只想指出什麼是好的,對CPU和GPU是不利的。當然,如果你製作一個極端的節目,即只有不好的或好的一面,它將在一個平臺上更快地運行,肯定是。但是這些混合物需要非常複雜的推理。

主持節目水平

一個關鍵的區別是內存的傳輸成本。 GPU設備需要一些內存傳輸。在某些情況下,這種成本並不是微不足道的,例如,當您不得不經常轉移某些大型陣列時。根據我的經驗,這個成本可以降到最低,但將大部分主機代碼推向設備代碼。唯一可以這樣做的情況是當您必須在程序中與主機操作系統交互時,例如輸出到監視器。

器件編程水平

現在我們來看看一個複雜的圖片已尚未完全顯現出來。我的意思是GPU中有許多神祕的場景尚未透露。但是,就性能而言,我們還是有很多區別CPU和GPU(內核代碼)的。

有幾個因素,我注意到這些顯着貢獻的差異。

  • 工作量分配

的GPU,其由許多執行單元,被設計爲處理大規模並行程序。如果您的工作量很少,請說出幾個順序任務,然後將這些任務放在GPU上,但這些執行單元中只有少數執行單元很忙,因此速度會比CPU慢。另一方面,CPU可以更好地處理短期和順序任務。原因很簡單,CPU要複雜得多,能夠利用指令級並行性,而GPU則利用線程級並行性。那麼,我聽說NVIDIA GF104可以做超標量,但我沒有機會體驗它。

值得注意的是,在GPU中,工作負載被分成小塊(或OpenCL中的工作組),並且塊以塊的形式排列,每個塊在一個流處理器中執行(我使用的是NVIDIA的術語) 。但在CPU中,這些塊是按順序執行的 - 我想不出除了單個循環以外的其他任何東西。

因此,對於塊數較少的程序,將會是,可能在CPU上運行得更快。

  • 控制流指令

分行是壞事的GPU,始終。請記住,GPU更喜歡平等的東西。相等的塊,塊內的相等線程,以及變形內的相等線程。但最重要的是什麼?

      ***Branch divergences.*** 

Cuda/OpenCL程序員討厭分支分歧。由於所有線程以某種方式被分成32個線程的集合,稱爲warp,warp內的所有線程都以lockstep執行,所以分支分支將導致warp中的一些線程被序列化。因此,經紗的執行時間將相應地相乘。

與GPU不同,CPU中的每個內核都可以遵循自己的路徑。此外,由於CPU具有分支預測,因此可以高效地執行分支。

因此,具有更多翹曲差異的程序是可能在CPU上運行得更快。

  • 內存訪問指令

這真的是夠複雜了所以我們要儘量簡短。

請記住,全局內存訪問具有非常高的延遲(400-800個週期)。因此,在舊一代GPU中,內存訪問是否合併是一個關鍵問題。現在你的GTX560(Fermi)擁有更多的2級緩存。因此,在許多情況下,全局內存訪問成本可能會降低。但是,CPU和GPU中的高速緩存不同,因此其效果也不同。

我可以說的是,它確實取決於你的內存訪問模式,你的內核代碼模式(內存訪問如何與計算交錯,操作類型等),來判斷在GPU上運行速度是否更快或CPU。但是不知何故,你可以預期GPU(GPU)中的大量緩存未命中對GPU有非常不好的影響(有多糟糕? - 這取決於你的代碼)。

此外,共享內存是GPU的一個重要特性。訪問共享內存與訪問GPU L1緩存一樣快。所以利用共享內存的內核將會有很大的好處。

我真的沒有提及,但那些能夠對在許多情況下,如銀行衝突,內存交易,GPU佔用的大小的性能影響大等因素...