【问题标题】:How do I create a parallel loop?如何创建并行循环?
【发布时间】:2013-10-02 06:29:22
【问题描述】:

您可能认为这是一个简单的问题,但我找不到解决方案。采取以下循环:

A = zeros(1,10000000);
parfor i = 1:length(A)
    A(i) = i;
end

这仅在我的计算机上的单个内核上运行,尽管它很容易并行化(或者至少应该是并行化的)。我正在使用 Matlab 2012b,我尝试查找有关如何创建并行循环的文档,但找不到任何文档(matlab 文档仅显示了如何创建这些循环的示例,而不是如何实际并行运行它们)。

我尝试查找如何修改并行计算工具箱设置,但它们都不起作用,因为它们都适用于 Matlab 2013(我使用的是 2012b)。如果有人能提供一个实际上并行运行的简单、可并行循环的示例,我将不胜感激!

注意:我已经检查并安装了并行计算工具箱,但我无法知道它是否已启用或如何启用它,因为文档似乎没有为我的版本提供答案(我在命令提示符中输入了preferences,但在那里没有看到)。

编辑:我这样做了:

matlabpool('open',4);
A = zeros(1,10000000);
parfor i = 1:length(A)
    A(i) = i;
end
matlabpool('close');

...但我真的不知道为什么会这样,我是否每次都关闭池,池实际上是什么(我读过documnentation,仍然不明白),并且matlabpoolparpool 有何不同...

【问题讨论】:

  • 也许你的意思是A(i)=i,现在你只是在循环之后一遍又一遍地覆盖同一个变量,A 将等于10000000
  • @GuntherStruyf 抱歉,这是一个错字;我测试时代码是正确的。
  • 你检查parpool了吗?它位于parfor 文档的“另见”部分:mathworks.de/de/help/distcomp/parpool.html
  • 可能是matlabpool open
  • 我还要补充一点 - 不要关闭 MATLABPOOL,除非您不打算在给定的客户端会话中运行任何进一步的 PARFOR 循环(也许除非工作人员正在使用您所在的集群上的共享资源可能建议更保守)

标签: matlab parallel-processing


【解决方案1】:

就像我在评论中所说,您需要启动 MATLAB 工作程序:

matlabpool open N

R2013b 版本中的parpool 命令replaced the matlabpool command。该命令会创建许多本地工作程序(假设您的默认集群是 local 配置文件),它们只是在没有 GUI 的情况下运行的 MATLAB.exe 进程,它们执行部分并行化代码,例如您的 parfor 循环。

【讨论】:

  • 吹毛求疵:PARPOOL 是否开放本地工作人员取决于您的默认配置指向的位置。如果您只有 PCT,那么您确实只能访问本地工人。如果你也有 MDCS,那么你可以在集群上运行 worker。
【解决方案2】:

不需要关闭池。在某些情况下,您可能希望将其保持打开以供以后重复使用(因为打开也需要一些时间)。测试零池大小有助于决定是否需要打开新的 matlabpool:

A = zeros(1,10000000);
if matlabpool('size') == 0 
   matlabpool('open',4) ;
end
parfor i = 1:length(A)
    A(i) = i;
end

【讨论】:

    【解决方案3】:

    由于从matlabpool 更改为parpool,创建池的方法更加简单。与parpool 不同,如果池已经存在,它不会抛出错误。只需调用gcp(代表“获取当前池”)。

    gcp();
    A = zeros(1,10000000);
    parfor i = 1:length(A)
        A(i) = i;
    end
    

    始终让游泳池保持开放是一种很好的做法;这只是确保它在您需要时打开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 2021-12-09
      • 2010-11-14
      • 1970-01-01
      相关资源
      最近更新 更多