Python矩阵提供numpy.dot()

Mik*_*ail 5 python performance numpy matrix-multiplication

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

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

所以我测试了两种类型的数据:

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

对于int32我获得了预期的结果,我的GPU algroithms比numpy的CPU表现更好: 在此输入图像描述

但是,在float64类型上,numpy.dot()表现优于我的所有GPU方法: 在此输入图像描述

所以,问题是: 为什么数组numpy.dot()如此之快float64,并且numpy使用GPU?

ali*_*i_m 6

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

但是,BLAS仅支持浮点类型.如果调用np.dot()整数数组,numpy将依赖于一个非常简单的内部C++实现,它是单线程的,比两个浮点数组上的BLAS点慢得多.

在不了解你如何进行这些基准测试的情况下,我敢打赌,numpy.dot对于float32,complex64和complex128数组,其他3种类型的BLAS,其他3种方法也可以轻松打败.


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