2016-08-25 163 views
3

我運行一個小實驗來對tf.sparse_tensor_dense_matmul操作進行基準測試。不幸的是,我對結果感到驚訝。TensorFlow tf.sparse_tensor_dense_matmul

我正在運行的稀疏矩陣,密向量乘法和變化

  • 稀疏矩陣(減小)
  • 緻密矢量的行數(減小)
  • 的列數
  • 稀疏矩陣的稀疏性(增加)

在增加每次運行的稀疏度時,我減少了列。這意味着非零值(nnz)的數量總是相同(每行100個)。

當測量計算matml操作所需的時間時,我預料它會保持不變(因爲輸出大小和nnz不同)。

我看到的反而是以下幾點: enter image description here

我看着C++代碼,看看我能發現的結果的任何原因。儘管如此,考慮到C++代碼,我也希望每次運行的時間都相同。如果我理解了正確的代碼,它將遍歷稀疏矩陣的所有nnz值(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/sparse_tensor_dense_matmul_op.cc#L239)。對於每個nnz值,它循環遍歷第二個密集矩陣的所有列(在我的情況下,它只有一列,因爲它是一個向量)(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/sparse_tensor_dense_matmul_op.cc#L245)。

我可以想象第二個矩陣/向量的行數會影響性能的唯一一點是https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/sparse_tensor_dense_matmul_op.cc#L246,如果它循環遍歷第二個矩陣/向量的所有行,那麼通過了解「maybe_adjoint_b」函數來到達目前需要的行。

[什麼讓我擔心「maybe_adjoint_b」的調用,它被稱爲變量「k」作爲行索引傳遞。雖然,我認爲「M」將是行索引和「K」稀疏矩陣的列索引]

問題:爲什麼我收到了MATMUL操作不同的執行時間,即使NNZ和輸出尺寸總是一樣的?

回答

1

我實際上認爲它不是TensorFlow的問題,而是第一種情況下輸入矢量的8MB輸入不適合L2存儲器。在所有其他情況下,向量是< = 800kb並且適合L2存儲器。