以下代码计算N维X点与W固定点之间的欧氏距离(在同一空间,N维)
有10,000个X点,只有14个W点。
距离方法调用分批进行(2.000点,有时200或20点)
距离操作涉及矩阵乘法(batchsizexN)x(Nx14)。还涉及元素明智的pow操作,以及cols / rows sum。
使用gpu会将两个矩阵从PC RAM复制到NVidia RAM。但我预计,在具有高维度(N = 1.000维度)的空间中,它会被恢复为时间执行改进。
但附带的代码做得非常糟糕:
CPU是Intel i7,gpu是Nvidia 750Ti。 我正在使用Ubuntu专用服务器。我认为X windows没有使用显卡。我只是连接víavnc/ ssh
最佳改进是1.2而不是一个i7核心的一个线程。
我是GPU上的新手。任何有助于取得更好成绩的帮助都将受到欢迎。
提前致谢
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