2

一部の不確定性が の並列性に起因することparforは理解していますが、完全にランダムにする必要がある理由がわかりません。ループの順序を強制的parforに (少なくとも大まかに) 尊重する方法はありますか? より具体的には、次の場合にそれを希望します。

parfor i=1:100
    do_independent_stuff()
end

プールの各ワーカーは、新しいタスク (つまり、この場合はループの新しい反復) を要求するときに、計算されていない、またはワーカーにまだ影響されていない最小の i に影響を与えます。

4

3 に答える 3

4

少なくともMatlabでは、何かを並行して実行すると、順序は重要ではないと想定されるように設計されていると思います。各スレッド/ワーカーは互いに独立している必要があります。ただし、この質問に示されているように、ジョブとタスクの制御インターフェイスを試し て、ある程度の制御を行うことができます。

于 2014-06-05T03:41:54.770 に答える
3

大まかに同期する必要がある場合、たとえば、スレッドが終了するか、別のスレッドを開始する前にある時点に到達するまで待機する場合は、セマフォ、ロック、ミューテックスなどを使用するのが最適です...

「Parallel toolbox」にそのような同期オブジェクトが含まれているかどうかはわかりませんが、たとえばセマフォを作成するための回避策を次に示します。

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 に答える