Mik*_*ail 5 python performance numpy matrix-multiplication
在我熟悉Python(Numba lib)中的CUDA时,我实现了矩阵提供方法:
numpy.dot()
numpy.dot()
所以我测试了两种类型的数据:
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?
numpy的典型安装将动态链接到BLAS库,BLAS库提供矩阵 - 矩阵和矩阵 - 向量乘法的例程.例如,当你np.dot()
在一对float64数组上使用时,numpy将在后台调用BLAS dgemm
例程.虽然这些库函数在CPU而不是GPU上运行,但它们通常是多线程的,并且针对性能进行了非常精细的调整.一个好的BLAS实现,如MKL或OpenBLAS,可能在性能方面难以击败,即使在GPU*上也是如此.
但是,BLAS仅支持浮点类型.如果调用np.dot()
整数数组,numpy将依赖于一个非常简单的内部C++实现,它是单线程的,比两个浮点数组上的BLAS点慢得多.
在不了解你如何进行这些基准测试的情况下,我敢打赌,numpy.dot
对于float32,complex64和complex128数组,其他3种类型的BLAS,其他3种方法也可以轻松打败.
*击败标准BLAS的一种可能方法是使用cuBLAS,这是一种可在NVIDIA GPU上运行的BLAS实现.该scikit-cuda
库似乎为它提供了Python绑定,尽管我自己从未使用它.