【发布时间】:2020-10-22 06:42:28
【问题描述】:
我使用 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,:])
我通过 umcommenting 第二个 import 语句在 GPU 上使用 cupy 尝试了此操作,但显然双 for 循环效率极低。 numpy 大约需要 6 秒,但 cupy 需要 26 秒。我明白为什么,但我并不清楚如何并行化这个过程。
我知道我需要编写某种归约内核,但我想不出如何通过对另一个数组元素的迭代操作来构造一个 Cupy 数组。
【问题讨论】:
-
你为什么不使用 scipy.spatial.distance.cdist?这必须比 CPU 循环快 5 到 10 倍
-
我明确地编码了我试图为读者理解做的事情。在现实生活中,我不会为 CPU 实现做双循环。然而,据了解,GPU 实现中没有像 scipy 这样的 elementwiseKernel 或 reductionKernel 的 Cuda 内核。这只是一个玩具数据集。我的真实数据集比这大得多,因此我为什么要尝试并行化它并将其移植到 GPU