我运行一个小实验来对tf.sparse_tensor_dense_matmul操作进行基准测试。不幸的是,我对结果感到惊讶。TensorFlow 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和输出尺寸总是一样的?