Matlab Parfor 比 for 慢得多 - 即使是可笑的并行程序

Matlab Parfor much slower than for - even with ridiculously parallel program

我比较了下面的代码。 序列号:

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 个似乎正在使用的可用本地内核。 想知道为什么会这样吗?

请记住,许多 MATLAB 运算(尤其是大型线性代数运算)本质上是多线程的。在这种情况下,inv 是多线程的,并且是 for 循环中的主导因素。当您将其转换为 parfor 循环时,如果您只有 'local' 集群类型可用,那么在 parfor 中可用的计算核心不会比在 for 中多.因此,parfor 循环 必须 for 循环慢,因为它必须将数据传输给工作人员以供他们操作。

一般来说,如果您只有 'local' 个可用的工作线程,那么只有当 MATLAB 无法对 for 循环的主体进行多线程处理时,parfor 才能击败 for .