2

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

parfor i=1:100
    do_independent_stuff()
end

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

4

3 回答 3

4

我认为它的设计使并行运行某些东西假定顺序并不重要,至少在 Matlab 中是这样。每个线程/工作者应该彼此独立。但是,如this question所示,您可以尝试 作业和任务控制界面来给您一定程度的控制。

于 2014-06-05T03:41:54.770 回答
3

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

于 2014-06-05T07:33:45.417 回答
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 ...
于 2014-06-05T08:46:23.117 回答