2014-12-05 233 views
2

如果你能幫我澄清關於GPU性能的一些細節,這將是非常好的,因爲我在這裏呆了幾個星期。 此外,我很抱歉我的英語不好,但我會盡力解釋這個問題。CUDA矩陣乘法的性能

所以,關於我的問題。我們來看看非常簡單的程序 - 使用共享內存的密集矩陣乘法。 據我所知,Nvidia公司提供了它的一個在CUDA編程指南,實現(這裏是鏈接): http://docs.nvidia.com/cuda/cuda-c-programming-guide/#shared-memory

這是非常簡單的,我想每個人誰是熟悉CUDA已經看過了。但是讓我們來衡量這個內核的性能(Gflops)。 使用「Nvprof」實用程序,我們可以測量一些度量來計算浮點運算的計數,使用cuda事件我們可以測量內核的執行時間。因此,對於方陣矩陣乘法(每個矩陣中2048x2048個浮點元素),我們有 (1.7180e + 10)/(0.054 * 10^9)Gflpos = 318Gflops。

現在很重要的一點是,我正在使用GeForce GTX Titan卡,其性能達到3.1 Tflops的單峯精度。因此,我們只達到了峯值性能的1/10,但我們已經使用了從我的大學CUDA課程中所瞭解的所有優化(共享內存,合併內存訪問等)。 在這裏,我猜測它是因爲它是內存綁定的問題,但據我所知它是不正確的。作爲cuBlas的一個例子(如果我是對的),SGEMM的功能達到峯值性能的71%。當然我明白要達到cuBlas性能是非常困難的,但爲什麼我達不到1 Tflop?

所以,問題是:

1)我對我的推理嗎?

2)我甚至無法達到峯值性能一半的主要原因是什麼?

3)我可以使用哪些其他優化? (這裏的一切,你知道將是非常有用的 - 文章,建議等)

謝謝你的關注!

+2

您是否熟悉[Google學術搜索](http://scholar.google.com/)?使用關鍵字「GPU」「CUDA」「GEMM」的簡單查詢產生了一系列處理高性能實現策略的文章。性能超越算法的其餘部分是精心設計的手工彙編語言實現(這幾乎適用於所有計算平臺)。 – njuffa 2014-12-05 17:38:16

+2

請顯示您的代碼。按照我的觀點,您的問題太廣泛了,無法得出明確的答案。沒有看到您的實施,有太多可能的地方可以提出改進建議。 – 2014-12-05 17:39:00

+0

關於代碼:我正在談論提高nvidia代碼的性能,並提供了鏈接。當然,我有自己的實現(速度提高1.4倍),但我決定不在這裏提供,因爲這不是我正在尋求的加速,而且我希望避免在自己的代碼中談論可能出現的錯誤。那麼讓我們考慮一下我們想要加速Nvidia代碼。 – 2014-12-05 18:35:44

回答

2

看看你提到的代碼,代碼只是一個簡單的例子來解釋,但不實際可用,因爲它沒有考慮其他優化因素。從這種例子中優化性能在我的學習經驗中並不有效。

當然,你看不到cuBlas的源代碼,但是很少有開源項目,包括MAGMA和實際的矩陣乘法實現。 MAGMA源代碼中的MAGMABLAS文件夾包含了BLAS的實現,有助於我學習矩陣乘法如何實際應用。

+0

非常感謝,我忘記了MAGMA是開源的。如果有針對開普勒的GEMM實施,那將解決我的問題。 – 2014-12-05 19:08:22

+0

什麼是塊大小?你在使用阻塞算法嗎? – 2014-12-05 22:19:27