【问题标题】:Vector operations using Gpu in Matlab在 Matlab 中使用 Gpu 进行向量运算
【发布时间】:2016-07-09 13:12:18
【问题描述】:

我正在编写一个需要计算向量距离并执行的 Matlab 代码

X = norm(A(:,i)-B(:,j));
%do something with X
%loop over i and j

经常。这是一个相对较小的计算,所以它并不真正适合 parfor,所以我认为最好的想法是使用 gpu 函数来实现它。

我发现 pagefun 和 arrayfun 做的事情和我想要的一样,但是它们执行的是元素操作而不是向量。

所以我的问题是,有没有更聪明的方法来计算没有 for 循环的范数?或者如果我真的需要使用 gpu,最好的方法是什么?

【问题讨论】:

  • 某事的标准是 4 次数学运算,它应该很快。如果他们很多,请尝试gpuarray,正如你提到的那样。
  • 请将带有循环的示例代码放入您的问题中,我的感觉是 pdist2bsxfun 在 CPU 上解决这个问题非常快,如果矢量化它。
  • 我执行了数百万次,所以它变得很慢。 “代码”基本上是一些简单的操作,试图找出高维空间中的哪个点更接近另一个。根据配置文件查看器,这是最慢的部分
  • pdist2(A',B','euclidean','Smallest',k) 是迄今为止最快的解决方案(在 cpu 上),但它不在 gpu 上运行。有什么建议?我还在一个比我的真实数据集小得多的玩具数据集上对此进行测试,所以我不确定它是否真的更快。
  • this solution : Approach #3。它基于 matrix-mul,在 GPU 上必须非常快(内存允许)。

标签: matlab parallel-processing gpu


【解决方案1】:

如果你需要 A 和 B 的所有元素之间的范数,最快的方法可能是这样的:

N = 1000; % number of elements
dim = 3; % number of dimensions
A = rand(dim,N, 'gpuArray');
B = rand(dim,1,N, 'gpuArray');
C = sqrt(squeeze(sum(bsxfun(@minus, A, B).^2))); % C(i,j) norm

我在 CPU 上得到 0.16 秒的执行时间,在 GPU 上得到 0.13 秒的执行时间。

【讨论】:

  • 此代码有效,但 pdist2 更快;有什么更快的代码建议吗?
猜你喜欢
  • 2015-08-21
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
相关资源
最近更新 更多