我试着估计
% 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函数类似,当我们进行并行运行时?
答案 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) )
,parfor
,batch
或其他一些并行指令。