2017-01-05 9 views
0

Matlabの並列プログラミングについて知っているので、私たちはワーカーが何をしているのかを正確に指定することができます。使用:parfor inside spmd block-matlabを使ったときのエラー

if labindex == x 
    %some computations 
end 


はまた、我々は並列にforループを実行することができます。使用した:私はいくつかのノードを持つクラスタを使用していますし、各ノードは、8つのコアを持つ

parfor i1 = x:y 
    %some computations 
end 


spmd 
    if labindex == 1 
     alpha = forward(some parameters); 
    end 
    if labindex == 2 
     beta = backward(some parameters); 
    end 
end 

私はこれらの2つの機能が2で同時に実行されますたかった:
私はそれぞれがparforループが含まれている2つの機能を実行すると、各機能は、作業者によって実行されます、私のコードは次のようなものです異なるノード。 しかし、MATLABは戻って、このエラーがスローされます。

PARFOR or SPMD can not be used inside an SPMD block. 

なぜそうでしょうか?

+0

Matlabのマニュアルに関連するポインタを追加しました。あなたのコードがエラーを出すようには思えません(最新のMatlabのドキュメントにはない)。したがって、取得したい場合は、[MCVE](http://stackoverflow.com/help/mcve)を提供する必要があります。さらにここで助けてください。 –

答えて

1

これはparforドキュメントで覆われている:

parfor - ループの本体は別のparfor -loopを含めることはできません。しかし、 は、別のparfor -loopを含む関数を呼び出すことができます。

しかし、労働者が並列プールを開くことができないので、作業者は は、並行して、内側のネストされたparfor -loopを実行することはできません。つまり、入れ子になったparfor -loopsのレベルは1つだけ だけ並列に実行できます。外部ループ が並列プールで並列に実行される場合、内部ループは各ワーカー 上で連続して実行されます。外側ループがクライアントで連続して実行される場合(たとえば、 parforワーカーが指定されていない場合)、内部ループを含む関数はプール内のワーカーに対して内部ループを並列に実行できます。 spmd文の本体が直接別のspmdを含めることはできません

同じことがspmd文についても同様です。 しかし、別のspmdステートメントを含む関数を呼び出すことができます。 内部spmdステートメントは、別の並列 プールでは実行されませんが、機能を含む を実行しているワーカー上の1つのスレッドで連続して実行されます。

あなたが実際に限り、それらが機能に封入されているようspmd/parforを入れ子にしていることができますが、彼らはまだ、並列に実行されませんように見えるので、何のポイントはありません。

+0

あなたの答えははっきりしていますが、私が使用しているクラスタの各ノードには8コアのCPUがあります。 'SPMD'ブロックでは' PARFOR'を含む関数を各作業者に割り当てています。これは、作業者が並列プール自体を開くことができることを意味します。このような状況ではどうなりますか? 'PARFOR'ループは並行して実行されますか? –

+0

並列プール自体を開くことができないので、作業者が持つコアの数は関係ありません。これは私が引用したドキュメントに明確に記述されているMatlabの制限です。 'parfor' /' spmd'をネストするのを避けるためにコードをリファクタリングするか、 'spmd'に頼るのではなく、複数のmatlabインスタンスを自分で分割する必要があります。 –

+0

私はそれを持っています。ありがとうございます。 –

関連する問題