Python GPU没有改善(cudamat)
以下代码计算N维X点和W固定点(在同一空间中,N维)之间的欧氏距离 有10.000个X点,只有14个W点 距离方法调用是成批进行的(2.000点,有时是200或20点) 距离运算涉及大小(batchsizexN)x(Nx14)的矩阵乘法。还涉及元素级pow操作和cols/rows和Python GPU没有改善(cudamat),python,numpy,gpgpu,Python,Numpy,Gpgpu,以下代码计算N维X点和W固定点(在同一空间中,N维)之间的欧氏距离 有10.000个X点,只有14个W点 距离方法调用是成批进行的(2.000点,有时是200或20点) 距离运算涉及大小(batchsizexN)x(Nx14)的矩阵乘法。还涉及元素级pow操作和cols/rows和 使用GPU有一个开销,将两个矩阵从PC RAM复制到英伟达RAM。但我预计在高维空间(N=1.000维)中,它会恢复为时间执行改进 但附带的代码产生了非常糟糕的结果: 当N=64维时,gpu的速度是gpu的0.2倍
使用GPU有一个开销,将两个矩阵从PC RAM复制到英伟达RAM。但我预计在高维空间(N=1.000维)中,它会恢复为时间执行改进
但附带的代码产生了非常糟糕的结果:- 当N=64维时,gpu的速度是gpu的0.2倍(cpu的速度是gpu的5倍)
- 当N=1000维时,gpu和cpu的结果相同
- 当N=10000维时,gpu的速度是gpu的1.2倍
- 当N=100000维时,gpu的速度是gpu的0.85倍
import numpy as np
import cudamat as cm
def distance(self, X, useGPU=False):
if useGPU:
print("using GPU...")
W=self.W
gpu_W = cm.CUDAMatrix(W)
gpu_X = cm.CUDAMatrix(X)
gpu_D = cm.empty ((W.shape[0] , X.shape[0]) )
gpu_X2 = cm.empty (X.shape)
gpu_W2 = cm.empty (W.shape)
cm.pow(gpu_X, 2, target=gpu_X2)
gpu_X2 = gpu_X2.sum(axis=1)
cm.pow(gpu_W, 2, target=gpu_W2)
gpu_W2 = gpu_W2.sum(axis=1)
gpu_D = cm.dot(gpu_W, gpu_X.T)
gpu_D = gpu_D.mult((-2))
gpu_D = gpu_D.add_col_vec(gpu_W2)
gpu_D = gpu_D.add_row_vec(gpu_X2.transpose())
D_T=gpu_D.transpose().asarray()
return D_T
else:
W = self.W
X2 = (X**2).sum(1)[:, None]
D = -2*np.dot(W, X.T) + (W**2).sum(1)[:, None] + X2.T
return D.T
我对库达马特一无所知。然而,我敢打赌,启动八个或九个单独的内核来执行这样一个简单的计算,会在固定延迟和浪费内存带宽方面付出巨大的开销。解决方案可能是编写一个GPU内核来执行该操作,并跳过cudamat elementwise原语,尽管我对cudamat一无所知。然而,我敢打赌,启动八个或九个单独的内核来执行这样一个简单的计算,会在固定延迟和浪费内存带宽方面付出巨大的开销。解决方案可能是编写一个GPU内核来执行该操作,并完全跳过cudamat elementwise原语