Python 如何在GPU上计算成对距离矩阵

Python 如何在GPU上计算成对距离矩阵,python,gpgpu,distance-matrix,Python,Gpgpu,Distance Matrix,我的代码中的瓶颈是我计算a的区域。因为这是迄今为止最慢的部分,所以我花了很多时间来加速我的代码 我在网上发现了许多使用文章的加速效果,但效果却微乎其微。因此,我正在寻找一种方法,使用我的GPU创建距离矩阵,以进一步加快速度。然而,我对使用GPU进行计算知之甚少有人能帮我吗? 在我的研究中,我发现了以下几点,但没有一个使用GPU: 是有用的,但加速是最小的 提供了关于如何使用cython和numba的信息 以下是如何计算成对距离矩阵的示例片段: import numpy as np from sc

我的代码中的瓶颈是我计算a的区域。因为这是迄今为止最慢的部分,所以我花了很多时间来加速我的代码

我在网上发现了许多使用文章的加速效果,但效果却微乎其微。因此,我正在寻找一种方法,使用我的GPU创建距离矩阵,以进一步加快速度。然而,我对使用GPU进行计算知之甚少有人能帮我吗?

在我的研究中,我发现了以下几点,但没有一个使用GPU:

  • 是有用的,但加速是最小的
  • 提供了关于如何使用cython和numba的信息 以下是如何计算成对距离矩阵的示例片段:

    import numpy as np
    from scipy import spatial
    
    rows = 1000
    cols = 10
    mat = np.random.randn(rows, cols)
    d_mat = spatial.distance.cdist(mat, mat)
    

    我的图形卡是Nvidia Quadro M2000M

    我可以使用:

    import numpy as np
    from numba import cuda
    
    USE_64 = True
    
    if USE_64:
        bits = 64
        np_type = np.float64
    else:
        bits = 32
        np_type = np.float32
    
    @cuda.jit("void(float{}[:, :], float{}[:, :])".format(bits, bits))
    def distance_matrix(mat, out):
        m = mat.shape[0]
        n = mat.shape[1]
        i, j = cuda.grid(2)
        d = 0
        if i < m and j < m:
            for k in range(n):
                tmp = mat[i, k] - mat[j, k]
                d += tmp * tmp
            out[i, j] = d
    
    def gpu_dist_matrix(mat):
        rows = mat.shape[0]
    
        block_dim = (16, 16)
        grid_dim = (int(rows/block_dim[0] + 1), int(rows/block_dim[1] + 1))
    
        stream = cuda.stream()
        mat2 = cuda.to_device(np.asarray(mat, dtype=np_type), stream=stream)
        out2 = cuda.device_array((rows, rows))
        distance_matrix[grid_dim, block_dim](mat2, out2)
        out = out2.copy_to_host(stream=stream)
    
        return out
    
    将numpy导入为np
    来自numba import cuda
    使用_64=True
    如果使用_64:
    位=64
    np_类型=np.64
    其他:
    位=32
    np_类型=np.32
    @jit(“void(float{}[:,:],float{}[:,:])”。格式(位,位))
    def距离矩阵(mat,out):
    m=材料形状[0]
    n=材料形状[1]
    i、 j=cuda.grid(2)
    d=0
    如果i
    我正在处理与您相同的问题-在过去几个月里,您有没有可能在这里分享任何突破?是的,我能够使用
    numba
    库中的
    cuda
    来编写此代码,并且我得到了显著的加速。。。给我24小时,我就可以找到我的代码并将其作为答案发布在这里。@PaulTerwilliger你还打算发布答案吗?在我努力为一个项目进行一些持久的同源性计算并运行之前,我也在寻找同样的东西