Numpy 如何正确使用anaconda accelerate for GPU

Numpy 如何正确使用anaconda accelerate for GPU,numpy,python-3.4,anaconda,numba-pro,Numpy,Python 3.4,Anaconda,Numba Pro,我试图用anaconda accelerate快速计算矩阵。我从一个非常基本的例子开始:乘以2个矩阵 我的目标是以某种方式获得比通常的numpy.dot更好的GPU乘法 这是我的基本示例,基于此 结果太糟糕了:GPU比CPU慢得难以置信 CPU: 0.00011801719665527344 GPU: 0.05677294731140137 True True CPU: 0.00011205673217773438 GPU: 0.3881375789642334 True True CPU: 0

我试图用anaconda accelerate快速计算矩阵。我从一个非常基本的例子开始:乘以2个矩阵

我的目标是以某种方式获得比通常的numpy.dot更好的GPU乘法

这是我的基本示例,基于此

结果太糟糕了:GPU比CPU慢得难以置信

CPU: 0.00011801719665527344
GPU: 0.05677294731140137
True
True
CPU: 0.00011205673217773438
GPU: 0.3881375789642334
True
True
CPU: 0.00038933753967285156
GPU: 3.018171787261963
True
True
当然,我知道内部numpy实现得到了很好的优化,但我希望anaconda官方示例会很好。我使用的是python 3.4.3,在使用这两个帮助库时出错:和

我应该说,有了gpupy,我在python2.7上成功地实现了加速

所以我的问题是:如何通过使用GPU获得比numpy CPU更好的矩阵乘法?anaconda官方示例有什么问题?python3是否有一个工作库允许以numpy方式使用GPU

===

结果

不幸的是,Python3没有简单而好的方法,请改用2.7

感谢@rth推荐真棒的图书馆

一些基准测试(使用anaconda mkl进行测试,因此numpy也很快)

和结果

CPU: 16.4765479565
GPU: 0.000520944595337

您应该看看BLAS实现,这些实现为经典线性代数运算提供了高度优化的例程。使用
gemm
函数执行密集矩阵的乘法

  • 例如,
    numpy
    中的矩阵乘法如果根据优化的BLAS实现(OpenBLAS、ATLAS、MKL等)进行编译,则会得到显著改进
  • 对于GPU,NVIDIA提供了cuBLAS实现。据此,可以使用module使用numpy数组调用它。您正在使用的,还提供了到cuBLAS的直接绑定

顺便说一句,如果您想对矩阵乘法的CPU与GPU性能进行基准测试,还应该指定Numpy在CPU计算中使用的BLAS,因为结果可能相差一个数量级(请参见)。

嗯,numbapro cublas()中没有dgemm函数,一些类似的名称,但是他们处理对角矩阵,这不是我需要的。我尝试了scikits.cuda,但正如前面提到的libs(比如gpupy),仍然存在不受支持的python3。看来我还是需要使用Python2,Python3在2015年仍然是未经加工的…@Apfel请参见您的评论链接中的
numbapro.cudalib.cublas.Blas.gemm
:应该可以<在
dgemm
中,code>d代表
double
,所以他们可能会放弃它。没有理由不支持python 3。除了少数例外,目前大多数严肃的模块都支持3.x和2.7。它确实以非常可爱的语法(比如纯numpy)在很大程度上胜过numpy。这个库有积极的支持,而且更重要的是,它确实比我以前测试过的gpupy好。可用数学函数的数量也不错()。多谢各位!这就是我想要的。唯一的问题是Python3现在无法使用,您是对的,声明“包的某些部分可能无法使用Python3”。尽管如此,Python3还是应该得到全面的支持,如果您在
scikits.cuda
中遇到Python3中某个特定函数的问题,可能需要在上打开一个bug,以便有人能够修复它。请注意,将数据复制到GPU或从GPU复制数据是昂贵的。因此,
gpuarray.toGPU
应该在timed部分中,然后我认为gpu时间会更高一些。查看您的计时,我怀疑culinalg.dot正在异步运行,即您需要synchronize(),否则gpu在打印“gpu:”语句期间仍在计算。根据您的尺寸,与CPU(MKL,28核)相比,GPU(特斯拉K40,运行时间为600毫秒,无数据传输)提高了约5倍。与您的设置相反,我使用的是numbapro.cudalib.Blas和do numba.cuda.synchronize()。
dim = 10000
rnd = np.random.RandomState(0)
a = rnd.rand(dim, dim).astype(np.float32)
b = rnd.rand(dim, dim).astype(np.float32)
a_gpu = gpuarray.to_gpu(a)
b_gpu = gpuarray.to_gpu(b)

start = time.time()
rescpu = np.dot(a, b)
print 'CPU:', time.time() - start

start = time.time()
resgpu = culinalg.dot(a_gpu, b_gpu)
print 'GPU:', time.time() - start

resgpu = resgpu.get()
print np.allclose(rescpu, resgpu)
print np.allclose(resgpu, rescpu)
CPU: 16.4765479565
GPU: 0.000520944595337