2016-08-25 167 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存储器。