簡體   English   中英

TensorFlow tf.sparse_tensor_dense_matmul

[英]TensorFlow tf.sparse_tensor_dense_matmul

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

我正在運行稀疏矩陣,密集向量乘法,並且變化

  • 稀疏矩陣的列數(減少)
  • 密集向量的行數(減少)
  • 稀疏矩陣的稀疏性(增加)

在增加每次運行的稀疏性時,我減少了列數。 這意味着非零值(nnz)的數量始終保持不變(每行100個)。

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

我所看到的是以下內容: 在此輸入圖像描述

我查看了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和輸出大小始終相同?

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

暫無
暫無

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

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