3

有人能说出为什么 Arrayfun 比 GPU 上的 for 循环快得多吗?(不在 CPU 上,实际上 For 循环在 CPU 上更快)

阵列乐趣:

x = parallel.gpu.GPUArray(rand(512,512,64));
count = arrayfun(@(x) x^2, x);

和等效的 For 循环:

for i=1:size(x,1)*size(x,2)*size(x,3)
  z(i)=x(i).^2;        
end

可能是因为 For 循环在 GPU 上不是多线程的吗?谢谢。

4

2 回答 2

3

我不认为你的循环是等价的。似乎您正在将数组中的每个元素与您的CPU 实现平方,但对arrayfun执行某种计数。

无论如何,我认为您正在寻找的解释如下:

在 GPU 上运行时,您的代码可以在功能上进行分解——在这种情况下为每个数组单元——并分别平方。这没关系,因为对于给定i的 , 的值[cell_i]^2不依赖于其他单元格中的任何其他值。最有可能发生的情况是将数组分解为S个缓冲区,其中S是您的 GPU 拥有的流处理单元的数量。然后每个单元计算其缓冲区每个单元格中数据的平方。结果被复制回原始数组,并将结果返回给计数。

现在不用担心,如果您正在计算看起来 *array_fun* 实际正在做的事情,类似的事情正在发生。该算法最有可能将数组划分为类似的缓冲区,而不是对每个单元格进行平方,而是将这些值相加。您可以将第一步的结果视为一个较小的数组,可以递归地应用相同的过程来计算新的总和。

于 2012-04-14T04:44:11.717 回答
1

根据此处的参考页面http://www.mathworks.co.uk/help/toolbox/distcomp/arrayfun.html,“传入用于评估的 MATLAB 函数为 GPU 编译,然后在 GPU 上执行”。在显式for循环版本中,每个操作都在 GPU 上单独执行,这会产生开销 - 该arrayfun版本是一个 GPU 内核调用。

于 2012-04-16T08:24:45.433 回答