【问题标题】:Python matrix provide with numpy.dot()Python 矩阵提供了 numpy.dot()
【发布时间】:2015-07-08 15:40:41
【问题描述】:

在我熟悉 Python (numba lib) 中的 CUDA 期间,我实现了矩阵提供方法:

  • 只需numpy.dot()
  • Strassen 算法与numpy.dot()
  • GPU 上的块方法
  • GPU 上的 Strassen 算法

所以我在 2 种类型的数据上对其进行了测试:

  • numpy.random.randint(0, 5, (N, N)) # with int32 elements
  • numpy.random.random((N, N)) # with float64 elements

对于 int32,我获得了预期的结果,其中我的 GPU 算法的性能优于带有 numpy 的 CPU:

但是,在 float64 类型上,numpy.dot() 的性能优于我所有的 GPU 方法:

所以,问题是: 为什么 numpy.dot() 使用 float64 数组会这么快,numpy 是否使用 GPU?

【问题讨论】:

    标签: python performance numpy matrix-multiplication


    【解决方案1】:

    numpy 的典型安装将与BLAS library 动态链接,该BLAS library 提供了矩阵-矩阵和矩阵-向量乘法的例程。例如,当您在一对 float64 数组上使用 np.dot() 时,numpy 将在后台调用 BLAS dgemm routine。尽管这些库函数在 CPU 而不是 GPU 上运行,但它们通常是多线程的,并且针对性能进行了非常精细的调整。一个好的 BLAS 实现,例如 MKLOpenBLAS,在性能方面可能很难被击败,即使在 GPU* 上也是如此。

    但是,BLAS 仅支持浮点类型。如果您在整数数组上调用 np.dot(),numpy 将转而使用 a very simple internal C++ implementation,它是单线程的,并且比两个浮点数组上的 BLAS 点慢得多。

    在不了解您如何进行这些基准测试的情况下,我敢打赌,对 numpy.dot 的简单调用也将轻松击败您的其他 3 种方法,即 float32、complex64 和 complex128 数组,这是 BLAS 支持的其他 3 种类型。


    * 击败标准 BLAS 的一种可能方法是使用cuBLAS,这是一个将在 NVIDIA GPU 上运行的 BLAS 实现。 scikit-cuda 库似乎为其提供了 Python 绑定,尽管我自己从未使用过它。

    【讨论】:

      【解决方案2】:

      我知道 numpy 会自动使用多个 cpu 处理器来编译库。对于某些功能(我认为 dot() 是其中之一,尽管我现在找不到 ref )。我怀疑这是正在发生的事情。我不知道有任何尝试获得 numpy gpu 后端 http://www.reddit.com/r/Python/comments/1mw9mb/is_there_a_gpu_backend_for_numpyscipy_money_is_no/

      【讨论】:

        猜你喜欢
        • 2020-08-02
        • 2013-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-12
        • 2017-07-05
        • 1970-01-01
        相关资源
        最近更新 更多