簡體   English   中英

為什么cuSparse比cuBlas慢得多,因為稀疏矩陣乘法

[英]Why cuSparse is much slower than cuBlas for sparse matrix multiplication

最近當我在CUDA TOOLKIT 6.5中使用cuSparse和cuBLAS進行稀疏矩陣乘法時,我發現cuSPARSE在所有情況下都比cuBLAS慢得多!

在我所有的實驗中,我用cusparseScsrmm在cuSparse和cublasSgemm在CUBLAS。 在稀疏矩陣中,總元素的一半為零。 我使用的GPU是NVIDIA Titan Black。 此外,所有消耗的時間都是通過NVIDIA提供的nvvp工具獲得的。 以下是一些結果:

實驗A:

  1. 稀疏矩陣大小:192x2400
  2. 密集矩陣大小:2400x256
  3. cusparse時間:1.4ms
  4. 古巴拉斯時間:0.21毫秒

實驗B:

  1. 稀疏矩陣大小:192x75
  2. 密集矩陣大小:75x1024
  3. cusparse時間:0.27ms
  4. 古巴拉斯時間:0.04ms

所以,看到上面列出的結果是很奇怪的。 因為cuSPARSE專門設計用於處理稀疏矩陣操作,所以它怎么能比cuBLAS更慢!? 如果是這樣,則根本不需要使用cuSPARSE。 你能告訴我結果的任何解釋嗎? 另外,你能否提出任何其他方法來加速稀疏矩陣乘法?

我不認為你可以將半零的矩陣歸類為“稀疏”:你發現的時間是合理的(實際上稀疏算法的表現非常好!)。

稀疏算法僅在考慮大多數元素為零的矩陣時才有效(例如,來自有限元問題的矩陣)。

這適用於CPU,不僅適用於GPU:將矩陣視為稀疏處理有一個重要的開銷,只有當......大多數元素為零時才使用稀疏算法變得很方便(典型:十個或更少的非零)每行,排名數千 - 數十萬 - (數百萬?))。

還有其他矩陣形狀具有有效的解決方案算法,如果它適用於您的問題,您可以嘗試,例如波段矩陣。 我不知道他們是否已被移植到cuBlas。

關於管理費用

密集線性代數算法可以最佳地執行,因為處理器的設計是為了最有效地解決這樣的系統。 考慮DGEMM操作(矩陣 - 矩陣乘法):對於大型矩陣(即,矩陣不適合系統的任何高速緩存),它允許您使用理論峰值浮點性能的95%以上的處理器。 怎么樣?

  • 預取
  • 最佳緩存使用率
  • 矢量化(SSE,AVX)
  • 流水線

在稀疏的LA算法中,只有非零元素及其相應的索引存儲在存儲器中:存儲器訪問實際上是間接的 因此,稀疏算法無法在相同的優化級別上利用硬件:我不知道在這種情況下的具體數字,但10%到20%不會很奇怪。

顯而易見的是,對零的操作(在非存儲元件上)根本不執行,導致操作量減少,所需存儲量減少。

整數邏輯,條件有進一步的開銷,但現代CPU在重疊整數和FP操作以及“推測執行”方面相當不錯。 不幸的是,他們也可以防止矢量化,因此對於密集的情況也是如此。

GPU怎么樣?

密集LA算法是GPU的最佳選擇,與CPU相同:在這種情況下,您可以優化使用:

  • 合並
  • 共享內存
  • 內存訪問模式

再次,稀疏LA算法中對矩陣元素的間接訪問阻止了利用相同級別的優化。

參考

我不記得在遇到稀疏問題時我使用了哪一個......我認為這是PSBLAS: http ://people.uniroma2.it/salvatore.filippone/psblas/

但在這里你將被他們所淹沒: http//www.netlib.org/utk/people/JackDongarra/la-sw.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM