代码之家  ›  专栏  ›  技术社区  ›  user1809923

防止MATLAB打开池

  •  11
  • user1809923  · 技术社区  · 10 年前

    当我安装并使用并行计算工具箱时 parfor 在我的代码中,一旦池到达 帕弗 环然而,这有时很难调试,这就是为什么我希望防止MATLAB在某些情况下打开池。那么,我怎么能告诉MATLAB不要开游泳池呢?显然,我可以通过代码删除所有 帕弗 循环并将其替换为正常 for 循环,但这很乏味,我可能会忘记撤消更改。

    编辑: 为了指定,我理想地希望parfor循环在设置控件或变量等时的行为与for完全相同。也就是说,例如,我也应该能够在for循环中放置断点。

    3 回复  |  直到 9 年前
        1
  •  7
  •   Adriaan Decoder    9 年前

    在主页下->平行->并行首选项您可以取消选中复选框“当执行并行关键字时自动创建并行池(如果还不存在)”。这将使所有 parfor 循环表现为正常 for

    如果我想办法在代码中实现这一点,而不是使用复选框,我会回复您。

    使现代化 事实证明,确实可以通过代码更改设置,尽管我不建议这样做,因为这涉及更改MATLAB的首选文件。这是从 Undocumented MATLAB blog 由Yair Altman创作。

    ps = parallel.Settings;
    ps.Pool
    ans = 
      PoolSettings with properties:
                                AutoCreate: 1
                    RestartOnClusterChange: 1
        RestartOnPreferredNumWorkersChange: 1
                               IdleTimeout: 30
                       PreferredNumWorkers: 12
    

    您需要更改 AutoCreate 切换到 0 .

    作为替代方案,我建议将所有东西都包装在你的 帕弗 在函数中,因此调用

    parfor 1:N
        output = function(..)
    end
    

    现在修改脚本/函数 Parallel 顶部开关:

    if Parallel
        parfor 1:N
            output = function(..)
        end
    else
        for 1:N
            output = function(..)
        end
    end
    

    您可以编辑和调试 function 并在程序顶部设置开关,以并行或串行方式执行。

        2
  •  5
  •   Sam Roberts David Peden    9 年前

    以及正常语法

    parfor i = 1:10
    

    您也可以使用

    parfor (i = 1:10, N)
    

    哪里 N 是循环中使用的最大工作人员数。 N 可以是代码其他部分设置的变量,因此可以通过设置该变量来有效地打开和关闭并行性 N 设置为1或0。


    编辑:明确地说,这只控制执行代码的工作人员的数量(如果N为零,则表示是否启动了池)。如果不存在池,代码将在客户端上执行。尽管如此,该代码仍然是 parfor 循环,这样做 具有与 for 循环-对循环代码有限制 帕弗 不存在的循环 对于 循环,并且不能保证循环迭代的执行顺序。

    当您使用 帕弗 ,你做的不仅仅是说“请加快速度”。你对MATLAB说:“我可以向你保证,这个循环的迭代是独立的,可以按任何顺序执行,所以如果你尝试并行化,你会没事的”。因为你已经保证了,MATLAB能够通过使用不同于 对于

    唯一的办法是 对于 循环行为是使用 对于 ,如果为了调试需要来回切换,则需要注释和取消注释 对于 / 帕弗 (或使用 if / else 块,在 对于 和一个 帕弗 取决于一些变量)。

        3
  •  2
  •   Dennis Jaheruddin    10 年前

    我认为到这里去的方法,不是禁用 parfor ,而是让它像一个简单的 for .

    这应该可以通过将工人数量设置为1来实现。

    parpool(1)
    

    根据代码的不同,在运行代码之前,您可能只需要执行一次,或者在每次设置代码中任何位置的工作人员数量时,您都需要(有条件地)执行此操作。