2011-10-24 80 views
2

我可以看到很多關於OpenCL的內容,它似乎是最有希望的(唯一一個?)多架構庫。 OpenCL應該是第一個並行架構編程標準,並且最終將被大部分程序員採用。這很好,但是,從本地編程庫遷移到OpenCL會導致性能下降嗎?在nVidia GeForces的情況下,我已經發現一篇文章是同一個程序的兩個實現 - CUDA與OpenCL代碼 - 進行了比較,第一個似乎更高性能。在Pthread或Windows線程的情況下,我真的不知道,但我認爲「通用性」和多架構方法總是會有「付出」的東西。 只是爲了停止對這個或那個問題的猜測,我想自己檢查一切,但我需要你幫助我!是否有一個OpenCL基準測試集,可以用來與本地代碼進行比較,這是普遍接受的?是否有類似OpenCL代碼編寫的CUDA SDK? 感謝大家。OpenCL Benchmark

+0

如有以下答案回答你的問題給它一個綠色對號 – Yakk

回答

3

目前沒有設置性能基準來測試不同框架的速度。幾個基準已經創建。着名的例子包括SHOC基準套件和Rodinia。即將發佈OpenCL and the 13 Dwarves,這對基準測試可能有用。

爲了做到框架之間的測試,已經完成在性能方面的測試OpenCL和CUDA之間的區別的工作。這些工作中的一部分涉及瞭解OpenCL,雖然存在正確性可移植性,但不能保證性能可移植性。 Daga在他的論文中強調了架構感知優化的重要性。

+0

SHOC是Oakridge國家實驗室開發的一個很好的基準。以下是我認爲非常好的HPC連線文章:http://www.hpcwire.com/hpcwire/2012-02-28/opencl_gains_ground_on_cuda.html –

4

不是性能/基準測試專家我只能嘗試給你一些關於OpenCL和CUDA的一般想法。公平的警告雖然,我可能會得到一些錯誤的東西。

基準測試的問題很明顯,您只能客觀地評估非常特定的事情 - 比如說,在CUDA和OpenCL中完成的相同程序,在同一硬件上(與您命名的源代碼一樣)。但是,您將無法從該實驗中推斷出您將在另一個程序或不同的硬件上獲得類似的結果。結果會有所不同,所以你將不得不有一個大的測試套件。這就是你所要求的,但我不知道存在的任何東西 - 人們會選擇任何一種技術用於他們更大的項目,而不會把所有的東西都寫兩遍。

NVIDIA代碼示例有CUDAOpenCL。你可以選擇一些並比較你的結果。

雖然我不認爲這將花費時間。也許你應該從另一個角度來處理這個問題:你可以用一個你不能用另一個做的框架來做什麼?他們都使用相同的驅動程序,因此兩者都將支持新硬件出現的奇特技術。線程調度在硬件中完成,因此它們在那裏具有相同的性能。什麼還有待檢驗的東西,如:

  • 將最佳代碼使用所有可用內存帶寬
  • 將編譯器創建高效的代碼
  • 你能夠讓所有的計算單元中使用
  • 和所以...

從我的測試中,這些問題的答案 - 我的代碼是否會最佳地使用硬件 - 對於這兩個框架都是肯定的。所以他們肯定在同一個聯盟中打球,即使現在某個具體問題比另一個快5%,我也不會在一般觀點上有所作爲。

我故意沒有寫關於OpenCL的其他用例的任何信息,例如:在CPU上。由於您擁有不同的操作系統,甚至針對相同處理器(例如Apple和I​​ntel)的不同OpenCL SDK,以及許多在沒有OpenCL的情況下並行編程的方式(相比較),該字段的範圍更廣。

+0

非常感謝。我同意你寫的所有內容,但我有一些具體的問題需要解決。我知道,速度提高5%並不是 - 一般來說 - 顯着的提速,但現在我問自己「好的,我必須做這個計算,我會用什麼硬件和什麼庫?」顯然,我會選擇更快的解決方案。我的問題的維度沒有設定,也許5%的性能差異可能變得「重要」。所以,非常感謝您的回答,我將學習nVidia示例的OpenCL版本。 – biagiop1986

+0

@ biagiop1986:不僅僅是性能考慮。請記住,CUDA代碼只能在NVIDIA設備上運行,並且OpenCL代碼可以運行在衆多設備上,包括那些NVIDIA設備。這不是「所有其他事情都是平等的」情況。除非您要運行一次代碼,並且再也不需要它,考慮到硬件兼容性可能非常重要。當AMD發佈一款速度非常快的新卡時會發生什麼?還是NVIDIA下了?對於硬件不可知代碼有很多要說的。 –

2

一般來說OpenCL和CUDA獲得相同的性能。 有沒有適當的基準,因爲根本無法比較不同的硬件和體系結構。

如果你刨去編寫一個基於GPU的應用程序,只是想知道至極一個你應該選擇。不要因爲速度而決定這個或那個。與CPU實現相比,OCL和CUDA都會給x100-x300加速。

我的建議:

  • 如果你打算做一個高層次的應用程序,你需要大量的庫,也許應該使用CUDA,因爲它有一個更好的SDK和支持。

  • 如果您打算做低級應用程序,並且您將從頭開始編寫所有代碼,請使用OpenCL,因爲它將支持幾乎所有未來的硬件(CPU和GPU)。你也可以使用一些庫,但是沒有CUDA好。