1. 程式人生 > >tensorflow的CPU和GPU的區別

tensorflow的CPU和GPU的區別

最近深度學習CPU根本不夠用,老闆配置了GPU 怎麼能不會用呢?原來從來沒有關注過的底層東西,於是乎痛下決心搞清楚原理和操作

先來看看第一部分

為什麼GPU比CPU更diao呢? 這裡就需要從他麼的區別入手那他麼的區別是什麼呢? 這裡就需要從他的原理出發了,由於其設計目標的不同,它們分別針對了兩種不同的應用場景

CPU 需要很強的通用性 為了處理各種不同的資料型別,同時又要邏輯判斷又會引入大量的分支跳轉和中斷的處理。這些都使得CPU的內部結構異常複雜。

While GPU 面對的是型別高度統一的、互相無依賴的大規模資料和不需要被打斷的純淨的計算環境 於是乎:CPU和GPU就呈現出非常不同的架構(看圖)

這裡寫圖片描述

  • 鮮綠色:計算單元ALU(Arithmetic Logic Unit)
  • 橙紅色:儲存單元(cache)
  • 橙黃色:控制單元(control)

GPU:數量眾多的計算單元和超長的流水線,只有簡單的控制邏輯並省去了Cache CPU:被Cache佔據了大量空間,而且還有有複雜的控制邏輯和諸多優化電路。

*結果可想而知:看這個更詳細的圖片*
  • 1

這裡寫圖片描述

  • 來,小明,你說你看出什麼區別了
  • 我看到了黃色的東西,一個大一個小。
  • 就看不到深層的東西?
  • 老師,我餓了。
  • 滾出去。

我給大家說一下啊!

  1. Cache, local memory: CPU > GPU

  2. Threads(

    執行緒數): GPU > CPU

  3. Registers(暫存器): GPU > CPU 多暫存器可以支援非常多的Thread
  4. thread需要用到register,thread數目大register也必須得跟著很大才行。
  5. SIMD Unit(單指令多資料流,以同步方式,在同一時間內執行同一條指令): GPU > CPU。

文字很麻煩吧,可以形象的看[這個視訊 挺有意思的]

  1. CPU有強大的ALU, 可以在很少的時鐘週期內完成算術計算,可以達到64bit 雙精度,執行雙精度浮點源算的加法和乘法只需要1~3個[時鐘週期]

  2. CPU的時鐘週期的頻率非常高,達到1.532~3gigahertz(千兆HZ, 10的9次方).

再看看GPU

這裡寫圖片描述

GPU是基於大的吞吐量特點:很多的ALU和很少的cache

  • 快取的目的不是儲存後面需要訪問的資料,這點和CPU不同,而是為thread提高服務

    如果有很多執行緒需要訪問同一個相同的資料? 快取會合並這些訪問,然後再去訪問dram(因為需要訪問的資料儲存在dram中而不是cache裡面)

    獲取資料後cache會轉發這個資料給對應的執行緒,這個時候是資料轉發的角色,由於需要訪問dram,自然會帶來延時的問題。

    GPU的控制單元(左邊黃色區域塊)可以把多個的訪問合併成少的訪問。

總的來說:有一個例子說的很好

  • GPU的工作大部分就是這樣,計算量大,而且要重複很多很多次。就像你有個工作需要算幾億次一百以內加減乘除一樣,最好的辦法就是僱上幾十個小學生一起算,一人算一部分

  • CPU就像老教授,積分微分都會算,就是工資高,一個老教授資頂二十個小學生,你要是富士康你僱哪個

  • CPU和GPU因為最初用來處理的任務就不同,所以設計上有不小的區別,而某些任務和GPU最初用來解決的問題比較相似,所以用GPU來算了 -
  • GPU的運算速度取決於僱了多少小學生,CPU的運算速度取決於請了多麼厲害的教授。教授處理複雜任務的能力是碾壓小學生的,但是對於沒那麼複雜的任務,還是頂不住人多。 -
  • 當然現在的GPU也能做一些稍微複雜的工作了,相當於升級成初中生高中生的水平。但還需要CPU來把資料喂到嘴邊才能開始幹活,究竟還是靠CPU來管的。

GPU適合幹什麼活?

(1)計算密集型的程式

所謂計算密集型(Compute-intensive)的程式,就是其大部分執行時間花在了暫存器運算上,暫存器的速度和處理器的速度相當,從暫存器讀寫資料幾乎沒有延時。

可以做一下對比,讀記憶體的延遲大概是幾百個時鐘週期;讀硬碟的速度就不說了,即便是SSD, 也實在是太慢了。

(2)易於並行的程式。

GPU其實是一種SIMD(Single Instruction Multiple Data)架構, 他有成百上千個核,每一個核在同一時間最好能做同樣的事情。