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
.
我比较了下面的代码。 序列号:
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
.