簡體   English   中英

稀疏矩陣與密集矩陣乘法 C++ Tensorflow

[英]Sparse Matrix Vs Dense Matrix Multiplication C++ Tensorflow

我想寫在 C++ Tensorflow 稀疏矩陣密集向量(SPMv)乘法:y = Ax

稀疏矩陣 A 以 CSR 格式存儲。 A 的通常稀疏度在 50-90% 之間。 目標是達到比密集矩陣密集向量 (DMv) 乘法更好或相似的時間

請注意,我已經查看了以下帖子: Q1 Q2 Q3 但是,我仍然想知道以下幾點:

  1. SPMv 乘法在時間方面與 DMv 相比如何? 由於稀疏性相對較高,我認為 SPMv 應該更好,因為減少了操作數量 - 是嗎?
  2. 為了使 SpMv 在時間上與 DMv 相同或更好,我應該考慮什么? 為什么有人說 DMv 會比 SPMv 表現得更好? 存儲表示是否有所不同?
  3. 在 C++ 中為 CPU 或 GPU 實現執行 SPMv 的任何推薦庫。

這個問題與我在這里的另一個問題有關:( CSCC:深度神經網絡的卷積拆分壓縮計算算法

要回答已編輯的問題:

  1. 除非矩陣非常稀疏(CPU 上的非零值 <10%,GPU 上的非零值可能 <1%),否則您可能不會從稀疏性中受益。 雖然減少了浮點運算的數量,但存儲量至少增加了一倍(列或行索引 + 值),memory 訪問是不規則的(您可以通過右側的索引進行間接訪問),它變得很遠更難以矢量化(或在 GPU 上實現合並),如果您進行並行化,則必須處理行長度不同的事實,因此 static 計划可能不是最佳的。
  2. 除了以上幾點,是的,存儲表示很重要。 例如,COO 矩陣存儲兩個索引和值,而 CSR/CSC 只存儲一個但需要一個額外的偏移數組,這使得它們在運行中構建起來更加復雜。 特別是在 GPU 上,如果您想至少實現一些合並,存儲格式很重要。 本文研究了存儲格式如何影響 GPU 的性能: https://onlinelibrary.wiley.com/doi/full/10.1111/cgf.13957
  3. 對於通用的嘗試 GPU 上的EigencuSparse 對於特定用例,還有很多其他的表現更好,但這部分問題並沒有明確的答案。

除了矩陣格式本身之外,甚至矩陣中條目的順序也會對性能產生巨大影響,這就是為什么 Cuthill-McKee 算法經常用於減少矩陣帶寬(從而提高緩存性能)的原因。

暫無
暫無

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

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