Python GPU没有改善(cudamat)

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倍

以下代码计算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倍(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ía vnc/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

我对库达马特一无所知。然而,我敢打赌,启动八个或九个单独的内核来执行这样一个简单的计算,会在固定延迟和浪费内存带宽方面付出巨大的开销。解决方案可能是编写一个GPU内核来执行该操作,并跳过cudamat elementwise原语,尽管我对cudamat一无所知。然而,我敢打赌,启动八个或九个单独的内核来执行这样一个简单的计算,会在固定延迟和浪费内存带宽方面付出巨大的开销。解决方案可能是编写一个GPU内核来执行该操作,并完全跳过cudamat elementwise原语