【问题标题】:A concrete example of a parfor loop in Matlab that outperforms the for loopMatlab 中 parfor 循环的一个具体示例,其性能优于 for 循环
【发布时间】:2012-08-13 13:10:26
【问题描述】:

我对 Matlab 中的并行计算还有些陌生。我在 C 中成功使用了 OpenMP,但在 Matlab 中无法获得更好的性能。

首先,由于我是一所大学的机器,我是新来的,我通过在命令提示符中输入ver 验证了我所在的机器具有并行计算工具箱,它显示:Parallel Computing Toolbox Version 5.2 (R2011b)。注意机器有4核

我尝试了使用parfor 与for 的简单示例,但for 总是获胜,尽管这可能是因为开销成本。我正在做一些简单的事情,比如这里的例子:MATLAB parfor is slower than for -- what is wrong?

在尝试将 parfor 应用到我更大更复杂的程序之前(我需要计算 500 次函数评估,每次评估大约需要一分钟,因此并行化在这里会有所帮助),我非常希望看到一个具体的例子,其中parfor 击败 for。 . OpenMP 的例子很多,但是没有找到一个简单的例子可以复制和粘贴显示parfor 比for 更好

【问题讨论】:

  • 您是否尝试过计算需要很长时间的函数?你可以只做一个里面有pause(5)的...
  • 你在使用parfor之前是否设置了matlabpool?例如:matlabpool open 4
  • @Serg:不。matlabpool open 4 只是意味着我想使用 4 个内核吗?如果是这样,那将非常有帮助。另外,例如,matlabpool open 3 是否意味着我只使用 4 个内核中的 3 个?
  • @GuntherStruyf:是的,我有,虽然这个例子很复杂,这就是为什么我想用一个简单的例子来检查一下。我现在离开我的工作电脑...明天我会检查你和 Serg 的建议并回来
  • 嗯..Serg 从这里开始看起来是对的:mathworks.ch/help/toolbox/distcomp/brb2x2l-1.html 它说“注意如果 matlabpool 没有运行,parfor-loop 在客户端连续运行而不考虑迭代顺序。”而且我没有打开matlabpool...

标签: performance matlab for-loop parallel-processing


【解决方案1】:

为了使用parfor,我使用以下代码(每个 Matlab 会话一次):

pools = matlabpool('size');
cpus = feature('numCores');
if pools ~= (cpus - 1)
    if pools > 0
        matlabpool('close');
    end
    matlabpool('open', cpus - 1);
end

这为其他进程留下了 1 个核心。 请注意,feature() 命令未记录在案。

【讨论】:

  • 太好了,谢谢!尝试远程登录,它工作。感谢您帮助我在 Matlab 中开始使用 parfor。
  • @dblazevski 欢迎您。远程登录是什么意思?这与我的问题有关吗? stackoverflow.com/questions/11726156/…
  • 啊,不,抱歉...之前在我上面的一个 cmets 中,我提到我远离工作计算机。我正在做一份新工作,我不知道实际的服务器名称是什么,所以我想我明天再试一次......然后在挖掘和猜测之后,我远程登录以测试你所说的。所以,不,不相关,但我在某种程度上是在大声思考。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    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 的回答运行代码以启用并行,您应该会获得相当明显的性能提升。

    【讨论】:

      猜你喜欢
      • 2014-06-10
      • 2012-11-06
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      相关资源
      最近更新 更多