2011-04-20 70 views
14

偶然發現這個論壇主題dot product faster on cpu than on gpu using OpenCL,我再次被提醒,有些實例看起來像是爲OpenCL *製作的,但是它們在何處使用,OpenCL並沒有爲我們提供增益。即我也有一個使用pyopencl代碼的kmeans實現,它比簡單的python代碼快幾倍,但仍然比kmeans的scipy函數快幾倍。何時使用OpenCL?

那麼你如何決定何時使用OpenCL?

  • 你需要什麼顯卡?顯卡必須要比'cpu'好多少。 Quadro FX 580與i7 860足夠嗎?
  • 問題有多大?你需要數百萬次的乘法才能獲得某些東西或者有幾百個足夠的東西?
  • 爲了讓OpenCL有價值,需要對kmeans或dot產品等「簡單」算法進行多少優化?

或者是這些三角形的情況下,你只能(/不得不)選擇三個角落中的兩個,使其工作?

problem size 
     /\ 
    /\ 
    / \ 
    / \ 
    /________\ 
GPU/CPU optimization 

我知道,我以前有點太大膽的語言,標題和問題的。如果我能想出更合適的措辭,我會改變它。

謝謝。像點積,k均值或矩陣乘法

回答

6

就像每個技術決策

*簡單的矩陣運算,答案取決於要達到的目標。有關GPU的OpenCL功能的信息可以在供應商頁面上找到。注意:並非所有GPU都支持OpenCL,並非所有支持OpenCL的GPU都支持雙精度。您也可以考慮可能沒有OpenCL環境的客戶/客戶端。

GPGPU編程(OpenCL和CUDA)適用於(幾乎)所有類型的線性代數問題。這些問題很容易並行化,因此很容易在像GPU這樣的並行環境中使用。 GPU上的所有問題都不需要太複雜和並行設計。這真的取決於你的問題領域。

另一方面,您需要關注OpenCL的一些收益。需要將一些數據從RAM複製到GPU並返回,這會導致一些延遲。您應該對CPU和GPU上的不同問題大小進行一些時間測量。你會很容易地看到何時達到收支平衡。我在CPU Opteron X64 2x2600和GPU Geforce 8600GTS上嘗試了與ATLAS庫的矩陣乘法。矩陣乘法只是兩個維度爲N×N的矩陣。破解平臺的N大約在100左右。這個結果在很大程度上取決於所使用的CPU和GPU,在其他硬件上可能完全不同。

+1

添加到什麼裏克已經提到的,如果問題規模大足夠的話,你將幾乎總是在將計算交給GPU的過程中獲得良好的性能。所以如果一個給定的函數在CPU上比較慢(與CPU相比),那麼如果它是GPU上實現的更大代碼的一部分,則仍然可以隱藏開銷,而不必承擔主機之間的傳輸頭(MAIN )和設備(GPU)內存。 – 2011-04-21 23:34:27

7

答案的少數元素:

  • 點產品不是最適合操作以在GPU上運行,因爲它本質上是一個減少,需要線程之間的同步。
  • 任何「最近」的GPU都可以:NVIDIA GTX 2xx,ATI/AMD HD5xxx或更高版本最適合OpenCL使用。將數據移入/移出GPU的速度很慢,在最佳情況下通常爲6 GB/s。如果數據適合CPU高速緩存,那麼除非任務的計算/ IO比例很大,否則CPU可能會更快。
  • 簡單算法的高效代碼可以在AMD/NVIDIA代碼示例以及各種網站中找到。對於其他算法,找到正確的設計並優化代碼可能需要一些時間。經過一段時間後,每種微架構的優化都是特定的,並且需要更多的時間。
+0

考慮具有百萬或更多值的矩陣上的點積,並行化將大大提高性能,新數組中的每個單獨值都不依賴於最後一個,因此每個輸出可以單獨完成,然後每個工作組可以並行化得更多通過平行乘法運算,然後將所有結果相加。沒有必要真正同步,只要一切都完成了,沒有任何操作取決於最後一步。 – 2018-02-14 20:03:42

1

GPU的全部都是關於密集計算髮生的數據處理。您可以通過將計算密集型任務移植到GPU來卸載CPU。您收到的結果取決於您,因爲GPU只是一個工具,它需要「正確」使用。

11

真正的關鍵應該是你的算法是否有很多固有的並行在那裏你可以交出一個數據集並且有大量的並行處理髮生在它上面。記住一個GPU可能有許多核心,但它們每個只有時鐘.5-1GHZ。其優勢在於處理大量的並行操作以獲得極高的吞吐量。考慮吞吐量(數據計算*頻率*流水線階段) - 所以這將與頻率的1/6進行權衡,使用其中一個GPU核心,但可能超過6 *核心數量(流水線階段)。

當然還有的CPU <的額外開銷 - > GPU屏障,也是你的算法可能導致多個GPU時鐘週期來計算..