GPU没有改进(cudamat)

时间:2015-07-07 21:56:07

标签: python numpy gpgpu

以下代码计算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维度)的空间中,它会被恢复为时间执行改进。

但附带的代码做得非常糟糕:

  • N = 64维度gpu快0.2倍(cpu比gpu快5倍)
  • N = 1000维度gpu和cpu具有相同的结果
  • N = 10000维度gpu比gpu
  • 快1.2倍
  • N = 100000维度gpu比gpu
  • 快0.85倍

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

0 个答案:

没有答案