强制parfor尊重某些命令

时间:2014-06-05 03:07:11

标签: matlab parfor

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

parfor i=1:100
    do_independent_stuff()
end

当请求新任务(即在这种情况下是循环的新迭代)时,池中的每个工作者都会影响尚未计算或影响到工作者的最低i。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

如果你需要松散地同步事物,例如等到某个线程完成或者在开始另一个线程之前达到某个点,最好应该使用信号量,锁,互斥量等......

我不知道是否有&Parallel工具箱'包括这样的同步对象,但这里有一些解决方法来创建信号量,例如:

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 ...