為什麼 CPU 技術進步慢於 GPU 技術?

在 gpu 上運行的工作負載類型通常是高度並行的。 渲染一個3d 場景需要在成千上萬個獨立的多邊形上進行工作,然後將所說的多邊形映射到幾百萬像素,這些像素也是彼此獨立的。

這些類型的問題比較容易設計硬件: 如果你在一個令人尷尬的並行工作負載上工作,理論上你可以拋出儘可能多的獨立執行單元來解決這個問題,如果你有足夠的帶寬,你會得到一個線性加速。

對於 gpu 加速的工作負載,通常是這種情況,因此通過添加更多的執行單元通常可以獲得更高的性能。 隨著晶體管的增多,gpu 的擴展性非常好。

為什麼 CPU 技術進步慢於 GPU 技術?

相比之下,cpu 總是針對順序的線性代碼進行優化。 即使是現在,重點通常是降低延遲(運行程序所需的時間) ,而不是增加吞吐量(每單位時間完成的工作)。 如果您想要吞吐量,您可以使用 gpu 或向量 / simd 擴展。

現代的 cpu 盡最大努力在每個循環中運行多條指令,這是很困難的,因為軟件通常表現出許多變量之間複雜的依賴關係,並且可能根本沒有多少並行性。

為了完成這項任務,CPU 設計具有多個處理通道,能夠執行工作,並使用複雜得離譜的無序調度硬件來嘗試和保持這些通道的聯通。 為了提取並行性,它們從根本上採用順序的代碼,並且不管程序順序如何運行。

Cpu 內核從單個線程中提取更多並行性的能力大部分受限於我們對線程“未來”的瞭解程度。 這主要受限於我們在代碼中預測結果分支的能力,我們可以做到很好,但不是100% 的準確率。 但是這是一場必輸的戰鬥: cpu 類型的工作負載通常每6條左右就有一個分支,而且當我們進一步查找這個分支時,我們可能會得到一個錯誤的結果。 下面是我做的一個圖表,試圖優雅地說明這個問題:

為什麼 CPU 技術進步慢於 GPU 技術?

不幸的是,這不是通過把晶體管扔到問題上就能解決的事情。 雖然這有所幫助,但要獲得較大的收益,還需要在控制流預測方面進行更根本的改進。

在我看來,這可能是單核 CPU 性能沒有像 gpu 那樣得到改進的最大原因。 理論上,我們可以構建一個超寬 CPU 數據通路,它可以在無序緩衝區中保存程序的大部分內容,但是我們永遠不能保持它的正常運行。

公平地說,這裡的 cpu: gpu 變得如此之快是因為多線程非常適合這些類型的工作負載。 但是 CPU 也沒有忽略這些潛在的性能提高,因為每個現代 CPU 都使用多個內核。 大多數以 cpu 為中心的工作負載仍然不具有難以置信的並行性,但是現在幾個核之間近乎線性的性能提升相當普遍。 向 CPU 添加多個核是提高吞吐量的必由之路,隨著主流8和12核 CPU 的興起,我們已經看到了這一點。 只是不是所有的工作負載都能利用所說的改進。

【翻譯自https://www.hindustantimes.com/】


分享到:


相關文章: