我正在尝试在 Matlab 中做我认为必须是可以想象的最基本的 GPU 操作,但我似乎无法弄清楚。
我有一百万个 3D 坐标的列表,我想找到它们与另一个点的距离。核心是平方和函数“getDist(a,b)”的简单平方根,其中 a 和 b 是 3x1 向量。
如果没有 GPU,我可以像这样蛮力:
对于 x = 1:1e6 d(x) = getDist(points(:,x),point) end
如果我不介意浪费内存,我可以使用 repmat 一遍又一遍地重复我的单点,我认为这适用于 GPU:
点GPU = gpuArray(点);pointGPS = gpuArray(repmat(point,1,1e6));
d = sqrt(sum((pointsGPU - pointGPU).^2)));
这比在 CPU 上慢。我将其缩小到 .^2 由于某种原因在 GPU 上运行缓慢的问题。基本上,我将上面的线分成单独的部分(减法、平方、总和和 sqrt。在 GPU 上所有速度几乎快 10 倍,但 .^2 速度较慢。将数组本身与 .* 相乘在 CPU 和显卡。
我尝试使用arrayfun:
d = arrayfun(@(x) getDist(points(:,x),point), 1:1e6)
但这会给 GPU 带来错误:“gpuArray 输出类型当前未实现”。我认为这意味着它希望 GPU 阵列位于 1:1e6 所在的位置,而不是嵌入到函数中。我不知道如何以这种方式制定它,因为我想一次取列,而不是单个元素。
这必须是可以解决的。如果不解决大规模并行几何问题,那么 GPU 是什么……感谢您的帮助。