【问题标题】:Force parfor to respect some order强制 parfor 尊重某些命令
【发布时间】:2014-06-05 16:46:23
【问题描述】:

我知道某些不确定性源于parfor 的并行性质,但我不明白为什么它应该是完全随机的。有没有办法强制parfor 尊重(至少松散地)循环的顺序?更具体地说,我希望在以下情况下:

parfor i=1:100
    do_independent_stuff()
end

当请求一个新任务(即循环的新迭代)时,池中的每个工作人员都会受到尚未计算或影响工作人员的最低 i 的影响。

【问题讨论】:

    标签: matlab parfor


    【解决方案1】:

    我认为并行运行某些东西的设计是假定顺序并不重要,至少在 Matlab 中是这样。每个线程/工作者应该彼此独立。但是,正如question 中所指出的,您可以尝试使用job and task control 界面来获得一定程度的控制。

    【讨论】:

    • 感谢您的链接,我仍然不明白为什么 Matlab 决定完全不遵循循环顺序(好吧,这不是随机的)。像Python's multiprocessing pool.map 这样的其他一些库确实尊重顺序(显然减去了由并行化引起的不确定性)。很高兴了解作业和任务控制界面!
    【解决方案2】:

    首先,在实践中,PARFOR 并不是“完全随机的”——您可以很容易地观察到它以相反的顺序发出循环迭代块。在 R2013b 及更高版本中,如果您需要对排序进行更多控制(例如,如果您知道某些独立的事物可能需要很长时间,因此希望首先开始计算它们),您可以使用 PARFEVAL .

    【讨论】:

      【解决方案3】:

      如果您需要松散地同步事物,例如等到某个线程完成或到达某个点后再启动另一个线程,最好使用信号量、锁、互斥锁等...

      我不知道“并行工具箱”是否包含此类同步对象,但这里有一些创建信号量的解决方法,例如:

      https://stackoverflow.com/a/22874669/684399

      您还可以使用“System.Threading”命名空间中的对象(需要 .NET):

      初始化:

      someResultAvailable = System.Threading.ManualResetEvent(false);
      

      在某些工作中:

      ... do work ...
      someResultAvailable .Set();
      ... continue ...
      

      在另一个:

      ... do work ...
      if (!someResultAvailable.WaitOne(10000))
      {
          error('Timeout waiting for result from other thread');
      }
      ... continue now knowing that results are available ...
      

      【讨论】:

        猜你喜欢
        • 2012-12-05
        • 1970-01-01
        • 2020-02-02
        • 1970-01-01
        • 2018-12-02
        • 2016-07-07
        • 1970-01-01
        • 2012-03-08
        • 2016-02-12
        相关资源
        最近更新 更多