我对Matlab中的并行计算还有点新意。我成功地在C中使用了OpenMP,但在Matlab中无法获得更好的性能。
首先,由于我是大学新生的机器,因此我通过在命令提示符下键入ver
来验证我所使用的机器是并行计算工具箱,并显示:{{1 }}。请注意,该机器有4个核心
我尝试了使用Parallel Computing Toolbox Version 5.2 (R2011b)
与parfor
的简单示例,但for
总是赢了,但这可能是因为开销成本。我做的很简单,例如:MATLAB parfor is slower than for -- what is wrong?
在尝试将parfor应用于我更大的更复杂的程序之前(我需要计算500个函数的评估,每个评估需要大约一分钟,所以并行化将在这里有所帮助),我非常希望看到一个具体的例子for
击败parfor
。 。 OpenMP的示例很丰富,但没有找到一个简单的示例,我可以复制和粘贴显示for
优于parfor
答案 0 :(得分:7)
我使用以下代码(每个Matlab会话一次)以使用parfor
:
pools = matlabpool('size');
cpus = feature('numCores');
if pools ~= (cpus - 1)
if pools > 0
matlabpool('close');
end
matlabpool('open', cpus - 1);
end
这为其他进程留下了1个核心。
注意,feature()
命令没有记录。
答案 1 :(得分:3)
在Loren Shure's MATLAB blog上有一个改进parfor性能的例子。
她的例子只是计算魔方矩阵的等级:
function ranks = parMagic(n)
ranks = zeros(1,n);
parfor (ind = 1:n)
ranks(ind) = rank(magic(ind)); % last index could be ind,not n-ind+1
end
答案 2 :(得分:0)
Serg描述了如何启用"并行功能。 这是一个非常简单的剪切和粘贴示例,可根据要求对其进行测试。只需将以下内容复制并粘贴到mfile中即可运行。
function parfortest()
enable_parallel;
pause on
tic;
N=500;
for i=1:N
sequential_answer=slow_fun(i);
end
sequential_time=toc
tic;
parfor i=1:N
sequential_answer=slow_fun(i);
end
parallel_time=toc
end
function result=slow_fun(x)
pause(0.001);
result=x;
end
如果你已经运行了代码来启用并行,如Serg的答案所示,那么你的性能应该会有明显的提升。