使用 cupy 从 GPU 上的另一个矩阵创建距离矩阵

Using cupy to create a distance matrix from another matrix on GPU

我使用 numpy 编写了代码,该代码采用大小为 (m x n) 的数组...行 (m) 是由 (n) 个特征组成的单独观察结果...并创建大小为 (m x m) 的方形距离矩阵).该距离矩阵是给定观测值与所有其他观测值的距离。例如。第 0 行第 9 列是观测值 0 和观测值 9 之间的距离。

import numpy as np
#import cupy as np

def l1_distance(arr):
    return np.linalg.norm(arr, 1)

X = np.random.randint(low=0, high=255, size=(700,4096))

distance = np.empty((700,700))

for i in range(700):
    for j in range(700):
        distance[i,j] = l1_distance(X[i,:] - X[j,:])

我尝试在 GPU 上使用 cupy 取消注释第二个 import 语句,但显然双 for 循环效率极低。 numpy 大约需要 6 秒,而 cupy 需要 26 秒。我明白为什么,但我不是很清楚如何并行化这个过程。

我知道我需要编写某种归约内核,但我想不出如何通过对另一个数组的元素进行迭代操作来构造一个 cupy 数组。

在 A100 GPU 中使用广播 CuPy 需要 0.10 秒,而 NumPy 需要 6.6 秒

    for i in range(700):
        distance[i,:] = np.abs(np.broadcast_to(X[i,:], X.shape) - X).sum(axis=1)

这会向量化并使一个向量与所有其他向量的距离平行。