为了检查并行处理在matlab中是如何工作的,我尝试了下面的代码并测量了执行的时间。但我发现并行处理代码比普通代码需要更多时间,这是意料之外的。我在某处做错了吗?
并行处理代码
function t = parl()
matlabpool('open',2);
tic;
A = 5:10000000;
parfor i = 1:length(A)
A(i) = 3*A(i) + (A(i)/5);
A(i) = 0.456*A(i) + (A(i)/45);
end
tic;
matlabpool('close');
t = toc;
end
结果是并行处理
>> parl Starting matlabpool using the 'local' profile ... connected to 2 workers. Sending a stop signal to all the workers ... stopped.
ans =
3.3332
function t = parl()
tic;
A = 5:10000000;
for i = 1:length(A)
A(i) = 3*A(i) + (A(i)/5);
A(i) = 0.456*A(i) + (A(i)/45);
end
tic;
t = toc;
end
没有并行处理代码的结果
>> parl
ans =
2.8737e-05
答案 0 :(得分:2)
查看(显然)执行代码的串行版本的时间,它实际上是0
。这是可疑的,所以看看代码......
tic;
t = toc;
嗯,这会启动秒表并立即停止。是的,那应该是0s
。看一下并行代码......
tic;
matlabpool('close');
t = toc;
啊,在这种情况下,代码会执行关闭工作池的时间。这需要相当多的工作,所需的时间3.33s
是在Matlab中使用并行计算的开销的一部分。
是的,我确实相信你做错了什么,你没有衡量你(可能)认为你在衡量的东西。 tic
启动秒表并toc
读取它。你的代码启动秒表两次并读取一次,它应该只开始计时一次。