2012-01-23 11 views
4

次の短いスクリプトでは、単一のCPU計算と計算時間に関する並列化を比較する必要があります。完全な画像へMATLABでの並列化の問題

parforリンク:LINK

コードである:

n = 700; 
ranksSingle = zeros(1,n); 
tic 
for ind = 1:n 
    ranksSingle(ind) = rank(magic(ind)); 
end 
toc 

matlabpool local 4 
tic 
ranks = zeros(1,n); 
parfor (ind = 1:n) 
    ranks(ind) = rank(magic(ind)); 
end 
toc 
isequal(ranksSingle, ranks) 
matlabpool close 

Iもmatlabpool 2でそれを試してみました。プロセスウィンドウからはっきりと分かるように、並列計算(赤色で表示)を実行すると、すべてのコアが100%ビジー状態になります。

シングルCPU演算(青色で表示)を実行すると、妙に4つのコアも前よりもビジーです。私はコアが1つしか上がらないと思っていただろう。おそらくmagic()またはrank機能が組み込み並列化されているが、ここから読むことができる場合は、http://www.walkingrandomly.com/?p=1894のようにインターネットを検索した。だから、これらの4つのコアは完全に忙しいわけではありませんが、まだ私はすべてのコアが上がっているのだろうと思っています。

第2に、並列化されたバージョンの計算時間が本当に不思議です。単一のコアにジョブを配布することによって何らかのオーバーヘッドがあることはわかっていますが、これはあまり高くても結局は役に立たないはずです。(

誰かが私にそれについて何か教えてくれるかもしれません私は自分のfor-loopsをスピードアップしたいので、これは本当に立ち往生しています.2番目の質問は、コンピュータにある物理的なコアの数に常にワーカーのサイズを設定するコマンドがあれば、それは追加の利点かどうスレッディング?)

感謝をたくさん!

答えて

5

をあなたが並列ジョブを実行したい場合は、あなたはそれがあまりにも多くの高速な繰り返しを持つことが悪いですし、それはあまりにもいくつかの持っている悪いことをことを覚えておいてください遅い反復。それぞれ数百万回という数百万回の繰り返しを行うと、並列化のオーバーヘッドによってあらゆる可能性が失われます。 9回の反復でそれぞれ1時間かかる場合、8つのプロセッサーで並列実行すると、7つのプロセッサーがアイドリング状態になり、反復#9が終了するのを待っています。

したがって、magicrankの両方が高速すぎるため、この例では並列化の影響をテストするのが非常に悪いです。オーバーヘッド(私はmatlabpoolによって使用される時間をカウントしていないことに注意のビットがあります:私は同時に第2の並列ジョブを実行しましたが、大体、結果は再現性のあるべき

function testParfor2 
    tic 
    for i=1:4 
     pause(1); %# wait for 1 second 
    end 
    toc 
    matlabpool open 4 
    tic 
    parfor i=1:4 
     pause(1); %# wait for 1 second 
    end 
    toc 

Elapsed time is 4.050287 seconds. 
Elapsed time is 1.534534 seconds. 

注意! )、スピードアップはそこにあります。ポーズ長を長くすると、同じオーバーヘッドが表示されるはずです。また、実際のループでテストする必要があります(最も外側のループを並列化しようとすると、btw)。 2番目の質問に

matlabpool open 

物理コア数と同じ数の労働者が作成されます。ハイパースレッディングは、並列ジョブが実行されているときにコンピュータが応答し続けることを保証するのに役立ちます。

最後に、magicrankは、完全にマルチスレッド化されていない可能性がありますが、マルチスレッド化されたルーチンを呼び出す可能性があります。

+2

修正。例えば、 'rank'は' svd'を使います。これはマルチスレッド化されています。 –

+0

ありがとう、私は明日より高価な操作でそれを試してみるでしょう:) – tim

+0

@Jonas: 'matlabpool open'は私に" Matlabpoolを 'ローカル'設定... 2ラボに接続して起動します。上記の私のスクリーンショットからはっきりと分かるように、私は4つのコアを持っているので、それはapperently期待された結果ではありません!編集:どうか私は 'matlabpool(4)'を開始できません:私は得ています:あなたは最低4人の労働者を要求しましたが、スケジューラーのClusterSizeプロパティは現在、最大2人の労働者を許可するように設定されています。これ以上の作業者で並列ジョブを実行するには、Configurations Manager [...]を使用して 'local'構成のClusterSizeプロパティ設定を増やします。 – tim