我比较了以下代码。 串行:
N = 500;
M = rand(500,500,N);
R = zeros(500,500,N);
tic
for k = 1:N
R(:,:,k) = inv(M(:,:,k));
end
toc
并行:
N = 500;
M = rand(500,500,N);
R = zeros(500,500,N);
tic
parfor k = 1:N
R(:,:,k) = inv(M(:,:,k));
end
toc
我知道串行时间比并行时间短3倍 - 尽管我有4个似乎正在使用的可用本地核心。 对于它为什么会发生的任何想法?
答案 0 :(得分:1)
请记住,许多MATLAB操作(特别是大型线性代数操作)本质上是多线程的。在这种情况下,inv
是多线程的,并且是for
循环中的主导因素。当您将其转换为parfor
循环时,如果您只有'local'
群集类型可用,则parfor
中的可用计算核心数量不会超过for
中的计算核心数量。因此,parfor
循环只需必须比for
循环慢,因为它必须将数据传输给工作人员才能进行操作。
一般情况下,如果只有'local'
个工作人员可用,那么只有当MATLAB无法多线程化parfor
循环体时,for
才能击败for
。 / p>