CPU与GPGPU
哪些類型的問題更適合常規多核,哪些類型的更適合GPGPU?
GPU包含一些固定功能和可編程硬件。 當GPU趨向于越來越多的可編程單元時,當今的GPU執行一些常見的圖形任務,例如紋理采樣和使用專用硬件進行渲染。 相反,像素陰影是使用可編程SIMD內核完成的。 GPGPU工作負載主要在SIMD著色器內核上運行。
GPU是為非常規則的吞吐量工作負載而構建的,例如圖形,密集矩陣矩陣乘法,簡單的photoshop過濾器等。它們固有的設計可承受紋理采樣的延遲(1000多個循環操作),因此擅長承受長時間延遲。 。 GPU內核具有許多線程:當一個線程觸發長時間等待操作(例如,內存訪問)時,該線程將進入睡眠狀態(其他線程繼續工作),直到長時間等待操作完成為止。 這使GPU可以使執行單元的工作量比傳統內核多得多。
GPU不好處理分支,因為GPU喜歡將“線程”(如果不是nVidia,則為SIMD通道)批處理為扭曲并將它們一起發送到管道中以節省指令獲取/解碼能力。 如果線程遇到分支,則它們可能會發散,例如8線程線程束中的2個線程可以采用該分支,而其他6個線程則不采用。 現在,將經紗分為大小為2和6的兩個經紗。這些新形成的經紗將運行效率低下。 2線程扭曲將以25%的效率運行,而6線程扭曲將以75%的效率運行。 您可以想象,如果GPU繼續遇到嵌套分支,其效率將變得非常低。 因此,GPU并不擅長處理分支,因此帶有分支的代碼不應在GPU上運行。
GPU還不利于協作線程,因為在GPU上沒有很好地支持同步(但nVidia已在其中)。
因此,GPU的最差代碼是并行性較低的代碼或分支或同步性很多的代碼,例如數據庫,操作系統,圖形算法等。
編程模型的主要區別是什么?
GPU不支持中斷和異常。 對我來說,那是最大的不同。 除此之外, CUDA與C差別不大。您可以編寫一個CUDA程序,將代碼運送到GPU并在其中運行。 您在CUDA中訪問內存的方式有所不同,但這又不是我們討論的基礎。
導致編程模型上存在差異的主要底層硬件差異是什么?
我已經提到他們了。 最大的是GPU的SIMD性質,它要求以非常規則的方式編寫代碼,而沒有分支和線程間通信。 這就是例如CUDA限制代碼中嵌套分支數量的原因的一部分。
哪一個通常更容易使用,多少錢?
取決于您要編碼的內容以及目標是什么。
易于矢量化的代碼: CPU易于編碼,但性能較低。 GPU稍微難于編碼,但可以帶來很大的收益。 對于其他所有處理器,CPU都更容易使用,并且通常也具有更好的性能。
從長遠來看,為GPU實現高級并行性庫(例如Microsoft的任務并行庫或D的std.parallelism)是否可行?
根據定義,任務并行性需要線程通信,并且還具有分支。 任務的思想是不同的線程執行不同的操作。 GPU專為許多功能相同的線程而設計。 我不會為GPU建立任務并行性庫。
如果GPU計算的效率如此驚人,為什么設計的CPU不更像GPU?
世界上許多問題都是分支性的和不規則的。 數以千計的例子。 圖表搜索算法,操作系統,Web瀏覽器等。補充一下,甚至圖形也像每一代一樣變得越來越分支和通用,因此GPU也將越來越像CPU。 我并不是說它們將變得像CPU,但它們將變得更具可編程性。 正確的模型位于低功耗CPU和非常專業的GPU之間。
參考: Future Chips博客上我們JCG合作伙伴 Aater Suleman的CPU vs. GPGPU 。
相關文章 :
- 每個程序員應該了解的內存系統知識
- Erlang與Java內存架構
- Java Fork / Join進行并行編程
- Java并發教程–信號量
- Java并發教程–線程池
- Java并發教程–重入鎖
翻譯自: https://www.javacodegeeks.com/2011/09/cpu-vs-gpgpu.html
總結
- 上一篇: H5游戏开发:FC小蜜蜂
- 下一篇: Cocos画线