python – TensorFlow tf.sparse_tensor_dense_matmul

我运行了一个小实验来对tf.sparse_tensor_dense_matmul操作进行基准测试.不幸的是,我对结果感到惊讶.

我正在运行稀疏矩阵,密集向量乘法,并且变化

>稀疏矩阵的列数(减少)
>密集向量的行数(减少)
>稀疏矩阵的稀疏性(增加)

在增加每次运行的稀疏性时,我会减少列数.这意味着非零值(nnz)的数量始终保持不变(每行100个).

当测量计算matml操作所需的时间时,我预计它将保持不变(因为输出大小和nnz不同).

我所看到的是以下内容:
《python – TensorFlow tf.sparse_tensor_dense_matmul》

我查看了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存储器.

点赞