为什么arrayfun只使用一个核心?

时间:2017-01-29 00:42:07

标签: matlab parallel-processing gpu

我试着估计

% matlabpool open 2; % line 1
tic; arrayfun(@(x) sum(sum(rand(1000))), [1 : 100]); toc;
Elapsed time is 4.070030 seconds.

当我取消注释第一行以便创建一个包含2名工作人员的池时,我得到同样的结果。

为什么一些明显的系统功能不能自动执行并行模式? Matlab是否与GPU的arrayfun函数类似,当我们进行并行运行时?

2 个答案:

答案 0 :(得分:2)

在致电matlabpool之前致电arrayfun而未提高任何速度的原因是,创建多名工作人员的行为并不能使全部< / em>代码利用这些工作人员执行计算。如果您想利用工作人员库,则需要使用parfor(相关信息here)明确地将代码并行化。

parfor k = 1:10
    result{k} = sum(sum(a*b));
end 

通常,arrayfun 执行任何并行化或加速。实际上,它通常比简单地写出for循环慢,因为显式for循环允许更好的JIT加速。

for k = 1:10
    result(k) = sum(sum(a * b));
end

如果您想要执行使用GPU显示的操作,如果arrayfun的输入数据是gpuarray,那么它将在GPU上执行(使用{{ 3}})。但问题是,使用arrayfun 在GPU上执行的任何操作只有才能进行元素操作,以便每个元素上的操作独立于所有其他元素上的操作(使其成为并行)。在您的情况下,不是元素操作,因此无法使用arrayfun的GPU版本。

作为旁注,您需要使用distributed version of arrayfun而不是matlabpool,因为后者已被弃用。

答案 1 :(得分:1)

核心MATLAB确实使用线程和向量操作,但您必须自己对代码进行矢量化。例如,您需要编写

A = rand(1000, 1000, 100);
B = sum( sum( A, 1 ), 2 );

B现在是一个1乘1乘100的数组。我已经用了两笔钱来帮助你理解发生了什么,如果你想<_ em>想要对你要去的矩阵中的每个数字求sum(A(:)),或者对于这个批处理示例,{{ 1}}。

对于任务并行而不是数据并行,请使用sum( reshape(A, [], 100) )parforbatch或其他一些并行指令。