在认识Python(numba lib)中的CUDA期间,我实现了矩阵提供方法:
numpy.dot()
numpy.dot()
因此,我对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?
典型的numpy安装将与BLAS库动态链接,该库提供用于矩阵矩阵和矩阵向量乘法的例程。例如,当您np.dot()
在一对float64数组上使用时,numpy将在后台调用BLASdgemm
例程。尽管这些库函数在CPU而非GPU上运行,但它们通常是多线程的,并且对其性能进行了很好的调整。良好的BLAS实现,例如MKL或OpenBLAS,即使在GPU *上,在性能方面也可能难以匹敌。
但是,BLAS仅支持浮点类型。如果调用np.dot()
整数数组,则numpy将使用非常简单的内部C ++实现来回退,该实现是单线程的,并且比两个浮点数组上的BLAS点要慢得多。
在不了解您如何进行这些基准测试的更多信息的情况下,我敢打赌,简单地调用numpy.dot
也会轻松击败float3,complex64和complex128数组的其他3种方法,这是BLAS支持的其他3种类型。
*击败标准BLAS的一种可能方法是使用cuBLAS,这是将在NVIDIA GPU上运行的BLAS实现。该scikit-cuda
库似乎为其提供了Python绑定,尽管我自己从未使用过。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句