2012-02-09 134 views
11

考慮一個簡單的例子:向量加法。OpenCL CPU設備vs GPU設備

如果我爲CL_DEVICE_TYPE_GPU構建了一個程序,並且爲CL_DEVICE_TYPE_CPU構建了相同的程序,它們之間的區別是什麼(除了「CPU程序」在CPU上運行,「GPU程序」在GPU上運行)?

感謝您的幫助。

回答

35

設備類型有一些差異。對你的向量問題的簡單回答是:對於大向量使用gpu,對於較小的工作負載使用cpu。

1)存儲器複製。 GPU依靠您正在處理的數據傳遞給它們,並且結果稍後會讀回主機。這是通過PCI-e完成的,對於版本2.0/2.1,這會產生大約5GB/s。 CPU可以使用「就地」緩衝區 - 在DDR3中 - 使用CL_MEM_ALLOC_HOST_PTR或CL_MEM_USE_HOST_PTR標誌。看到這裏:clCreateBuffer。這是許多內核的瓶頸之一。

2)時鐘速度。時鐘速度上,cpus目前在gpus上有很大的領先優勢。對於大多數處理器而言,2Ghz處於低端,而對於大多數處理器來說,1GHz作爲高端處理器。這是一個真正有助於CPU在小工作負載下「贏得」GPU的因素之一。

3)併發「線程」。高端gpus的計算單位通常比cpu對應的計算單位多。例如,6970 gpu(Cayman)有24個opencl計算單元,每個計算單元分爲16個SIMD單元。大多數頂級桌面cpus有8個內核,而服務器cpus目前停止在16個內核。 (CPU核心映射1:1計算單元計數)opencl中的計算單元是設備的一部分,它可以執行與設備其餘部分不同的工作。

4)線程類型。 gpus有一個SIMD架構,有很多面向圖形的指令。 cpus有很多專門用於分支預測和一般計算的區域。一個CPU可能在每個核心中都有一個SIMD單元和/或浮點單元,但是我上面提到的Cayman芯片有1536個單元,並且每個單元都可以使用gpu指令集。 AMD稱它們爲流處理器,每個上述SIMD單元有4個(24x16x4 = 1536)。除非製造商想要切斷一些高速緩衝存儲器或分支預測硬件,否則任何cpu都不會有那麼多的sin(x)或dot-product-capable單位。 gpus的SIMD佈局可能是大型矢量添加情況下最大的「勝利」。也做其他專業功能是一大獎勵。

5)存儲器帶寬。 CPU與DDR3:〜17GB /秒。最新gpus> 100GB/s,速度超過200GB/s最近變得很普遍。如果您的算法不受PCI-e限制(請參閱#1),則gpu將在原始內存訪問中超出CPU。 gpu中的調度單元可以通過僅運行未等待內存訪問的任務來進一步隱藏內存延遲。 AMD稱之爲波陣面,Nvidia稱之爲扭曲。在程序重用數據的情況下,cpus有一個大而複雜的緩存系統來幫助隱藏他們的內存訪問時間。對於你的矢量增加問題,你可能會受到更多PCI-e總線的限制,因爲這些矢量通常只使用一次或兩次。

6)功率效率。一個gpu(正確使用)通常比cpu電效率更高。由於CPU在主頻方面占主導地位,真正降低功耗的唯一方法之一是降低芯片的時鐘頻率。這顯然導致更長的計算時間。綠色500列表中的許多頂級系統都加速了gpu。看到這裏:green500.org