2012-09-29 49 views
11

我對GPU編程頗爲陌生,但由於我有一個計算密集型任務,我已經轉向GPU尋求可能的性能提升。ArrayFire與原始CUDA編程?

我試圖重寫我的程序與ArrayFire Free版本。它確實比啓用了多線程的CPU例程更快,但是達不到我預期的程度(即,< 100%加速),並且返回的結果不太正確(<與CPU例程相比1%的錯誤,假設CPU例程的結果是正確的)。

我的任務主要是在大型矩陣(300MB-500MB大小)上的基於元素的float-32數學運算,很少有if/thens/switch-cases等。我猜測性能瓶頸可能是CPU和GPU之間的帶寬內存,因爲有很多數據讀取等。我測試的GPU是具有3GB視頻內存的GeForce 580GTX。

是否仍有一些優化顯著房間,如果我寫的原始代碼CUDA(與CUBLAS等和平均優化),而不是使用ArrayFire我的任務嗎?我閱讀了一些NVIDIA優化指南;似乎有一些內存訪問技巧可以加快數據訪問並減少銀行衝突。 ArrayFire會自動使用這些通用技巧嗎?

回答

16

感謝您的帖子。很高興聽到最初的結果是加快了速度。我在ArrayFire上工作,可以在這裏提問你的問題。

首先,對於任何人來說,真正需要代碼才能提高特異性。你能分享你寫的代碼嗎?

其次,你應該想想CUDA和ArrayFire以下列方式:CUDA是,爲您提供寫任何你想要的GPU代碼的能力的GPU編程的方式。但是,天真的CUDA代碼(通常比CPU慢)和專家級的時間戳,手工優化的CUDA代碼之間存在巨大差異。 ArrayFire(以及一些其他GPU庫,如CUBLAS)擁有許多人工優化的時間,並且通常會比大多數普通人有時間自己實現的效果更好。但是,在使用ArrayFire(或其他庫)的情況方面也存在差異。在ArrayFire庫調用的使用中可以並且應該調整變量以獲得最佳性能。如果你發佈你的代碼,我們可以幫助分享一些在這裏。

三,ArrayFire使用的依賴BLAS功能CUBLAS,所以你可能不會使用CUBLAS太大的差別直接看到的。

第四,是的,ArrayFire使用所有可在NVIDIA CUDA編程指南(例如更快的數據傳輸和減少內存體衝突像你提到)中提供的優化。這就是ArrayFire開發的大部分重點,也是優化這些事情的地方。

最後,你注意到的數據差異可能是由於CPU的大自然VS GPU計算。由於它們是不同的設備,因此您經常會看到稍微不同的結果。並不是CPU能夠提供比GPU更好的結果,而是它們都以稍微不同的方式使用有限的精度。如果您使用的是單精度而不是雙精度,那麼您可能會考慮這一點。發佈代碼也會讓我們對此有所幫助。

一旦發佈代碼,很高興可以擴展我的答案。

+0

它們都不符合IEEE規範嗎?我假設在兩者上使用「單精度」應該產生相同的結果。同樣,假設計算的順序也是一樣的。 – Royi