![](/img/trans.png)
[英]Why is Strassen matrix multiplication so much slower than standard matrix multiplication?
[英]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:
實驗B:
所以,看到上面列出的結果是很奇怪的。 因為cuSPARSE專門設計用於處理稀疏矩陣操作,所以它怎么能比cuBLAS更慢!? 如果是這樣,則根本不需要使用cuSPARSE。 你能告訴我結果的任何解釋嗎? 另外,你能否提出任何其他方法來加速稀疏矩陣乘法?
我不認為你可以將半零的矩陣歸類為“稀疏”:你發現的時間是合理的(實際上稀疏算法的表現非常好!)。
稀疏算法僅在考慮大多數元素為零的矩陣時才有效(例如,來自有限元問題的矩陣)。
這適用於CPU,不僅適用於GPU:將矩陣視為稀疏處理有一個重要的開銷,只有當......大多數元素為零時才使用稀疏算法變得很方便(典型:十個或更少的非零)每行,排名數千 - 數十萬 - (數百萬?))。
還有其他矩陣形狀具有有效的解決方案算法,如果它適用於您的問題,您可以嘗試,例如波段矩陣。 我不知道他們是否已被移植到cuBlas。
密集線性代數算法可以最佳地執行,因為處理器的設計是為了最有效地解決這樣的系統。 考慮DGEMM操作(矩陣 - 矩陣乘法):對於大型矩陣(即,矩陣不適合系統的任何高速緩存),它允許您使用理論峰值浮點性能的95%以上的處理器。 怎么樣?
在稀疏的LA算法中,只有非零元素及其相應的索引存儲在存儲器中:存儲器訪問實際上是間接的 。 因此,稀疏算法無法在相同的優化級別上利用硬件:我不知道在這種情況下的具體數字,但10%到20%不會很奇怪。
顯而易見的是,對零的操作(在非存儲元件上)根本不執行,導致操作量減少,所需存儲量減少。
整數邏輯,條件有進一步的開銷,但現代CPU在重疊整數和FP操作以及“推測執行”方面相當不錯。 不幸的是,他們也可以防止矢量化,因此對於密集的情況也是如此。
密集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.