Performance Matlab中parfor循环的一个具体示例,其性能优于for循环
我对Matlab中的并行计算还是有点陌生。我已经在C语言中成功地使用了OpenMP,但在Matlab中并没有获得更好的性能 首先,由于我是一所大学的计算机,我在命令提示符下键入Performance Matlab中parfor循环的一个具体示例,其性能优于for循环,performance,matlab,for-loop,parallel-processing,Performance,Matlab,For Loop,Parallel Processing,我对Matlab中的并行计算还是有点陌生。我已经在C语言中成功地使用了OpenMP,但在Matlab中并没有获得更好的性能 首先,由于我是一所大学的计算机,我在命令提示符下键入ver,验证我所在的计算机是否有并行计算工具箱,并显示:Parallel Computing Toolbox Version 5.2(R2011b)。请注意,机器有4个芯 我尝试了使用parfor和for的简单例子,但是for总是赢,尽管这可能是因为间接成本。我在做一些简单的事情,比如这里的例子: 在尝试将parfor应用
ver
,验证我所在的计算机是否有并行计算工具箱,并显示:Parallel Computing Toolbox Version 5.2(R2011b)
。请注意,机器有4个芯
我尝试了使用parfor
和for
的简单例子,但是for
总是赢,尽管这可能是因为间接成本。我在做一些简单的事情,比如这里的例子:
在尝试将parfor应用于更大更复杂的程序之前(我需要计算500次函数求值,每次求值大约需要一分钟,因此并行化在这里会有所帮助),我非常希望看到一个具体的例子,其中
parfor
比for
。OpenMP的例子很多,但我没有找到一个简单的例子可以复制和粘贴,说明parfor
比for
有一个例子可以说明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
我使用以下代码(每个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()
命令没有文档记录。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的答案所示,您应该会在性能方面得到相当明显的改进。您是否尝试过使用需要很长时间计算的函数?您可以只制作一个包含
暂停(5)
的…在使用parfor
之前是否设置了matlabpool?例如:matlabpool open 4
@Serg:No.matlabpool open 4
是否仅仅意味着我想要使用4个内核?如果是这样的话,知道这一点将非常有帮助。另外,例如,matlabpool open 3
是否意味着我只使用了4个内核中的3个?@GuntherStruyf:是的,我使用了,尽管示例很复杂,这就是为什么我想用一个简单的示例来检查问题。我现在离开了我的工作计算机…我明天会检查你和Serg的建议,然后再回来..Serg似乎从这里就对了:它说“注意,如果matlabpool没有运行,parfor循环在客户端上连续运行,而不考虑迭代顺序。”我没有打开matlabpool…太好了,谢谢!尝试了远程登录,成功了。感谢您帮助我开始使用Matlab中的parfor
。@dblazevski欢迎您。你说的远程登录是什么意思?这与我的问题有关吗?啊,不,对不起……之前我在上面的一个评论中提到我离开了一台工作电脑。我正在做一份新工作,我不知道实际的服务器名是什么,所以我想我明天再试一次。。。然后在挖掘和猜测之后,我远程登录来测试你说的话。所以,不,不相关,但在某种程度上我是在大声思考。