Main Content

SPMD.par那およびParfeval.からの选択

并列コードの通信

并列并列で计算をを実するにに,parParfeval.Parfevalonall.那またはSPMD.それぞれを构成ではプログラミングプログラミング概念をはて概念ますていいます。Parfeval.Parfevalonall.那またはSPMD.を使用します。

  • -Parfeval.またはParfevalonall.を使用する。

  • 計算中にワーカー間で通信する必要がある場合は、SPMD.を使用する。

Parfeval.によるブロッキングのあるカンバンボードにされれれれれれれれれれれれれれれれれれれれれれれれ计算れれれれれ计算グラフ计算れれ计算でグラフ计算れ计算计算で计算计算计算计算でで计算计算れ计算计算计算计算で计算れ计算计算计算计算计算れ计算计算计算计算计算计算计算计算计算れ计算计算れれ计算れれlafterまたはafterAllを使用して,Parfeval.演算の実行結果を収集できます。通常は、結果をその後の計算に使用します。

SPMD.SPMD.ステートメント中にラボラボますますますますますできできますますますますますます。

確信がもてない場合は、並列コード内で、それぞれの計算をワーカー間での通信なしに完了できるかどうかと自问してください。できる结合は,Parfeval.を使伴し。それ户外のの合书,SPMD.を使用します。

同期およびおよび非同の作业

parParfeval.那およびSPMD.から選択するときには、計算にクライアントとの同期が必要かどうかを検討します。

parSPMD.には同期がが必要なななため,matlab®クライアント上で新規計算の実行がブロックされます。Parfeval.ははが不错のため,クライアントクライアント自我に他ののを行できます。

マルチスレッディングとprocesspool.のパフォーマンスの比较

この例では,クライアントとprocesspool.での関数の実行速度を比較します。一部の MATLAB 関数ではマルチスレッディングを使用しています。これらの関数を使用するタスクは、シングル スレッドよりマルチスレッド上でパフォーマンスが向上します。このため、多数のコアをもつマシン上でこれらの関数を使用する場合、ローカル クラスターのパフォーマンスはクライアント上のマルチスレッディングより低下することがあります。

この例の最後に挙げられているサポート関数ClientFasterThanPool.は,复数の実行がparループよりクライアント上で高级であるである合trueを返します。构文はParfeval.と同じです。最初最初の数として关键,2番目の函数としてとして力のををしから,关键词。

まず、ローカルのprocesspool.を作成します。

p = parpool('当地的');
使用“本地”配置文件启动并行池(Parpool)连接到并行池(工人数:6)。

サポート关节ClientFasterThanPool.を使用词,关联eig.の実行がどれだけ速いかを調べます。eig.を含み,关关呼び出し表す名词关键词。

[〜,t_client,t_pool] = clientfasterthanpool(@(n)eig(randn(n)),0,500)
t_client = 22.6243
t_pool = 4.9334.

並列プールは、クライアントより速く解を計算します。t_clientmaxnumcompthreads.で除算して、クライアント上のスレッドあたりの所要時間を求めます。

t_client/maxNumCompThreads
ans = 3.7707.

既定で、ワーカーはシングル スレッドです。結果は、T_Pool.の値がt_client/maxNumCompThreadsの値のほぼ1.5倍であり,スレッドあたりの所要时空はとプール両両で近いこと示されます。关键词eig.ははマルチスレッディングの恩恵恩恵をていませませ

次次,サポート关圈ClientFasterThanPool.を使用词,关联luの実行がどれだけ速いかを調べます。

[〜,t_client,t_pool] = clientfasterthanpool(@(n)lu(randn(n)),0,500)
t_client = 1.0225
T_Pool = 0.4693.

ローカル マシンのコアが 4 個以上の場合、並列プールは通常クライアントより速く解を計算します。t_clientmaxnumcompthreads.で除算して,スレッドあたりの所要时间をを求め。

t_client/maxNumCompThreads
ans = 0.1704

この结果は,T_Pool.の値がt_client/maxNumCompThreadsのほぼ 3 倍であり、スレッドあたりの所要時間がクライアント上でプールよりもはるかに短いことを示しています。各スレッドの使用される計算時間は短く、luがマルチスレッディングを使用することを示しています。

补助关节

サポート关节ClientFasterThanPool.は那クライアント上の計算が並列プール上より速いかどうかをチェックします。この関数は、入力として関数ハンドルFCN.と入力引数の変数番号 (In1,In2,...)を受け入れます。ClientFasterThanPool.は那クライアントとアクティブな並列プールの両方でFCN(In1,In2,...)たとえば実行し。たとえば,兰特(500)をテストする場合、関数ハンドルは次の形式でなければなりません。

fcn = @(n)rand(n);

次に,ClientFasterThanPool(FCN,500)を使用します。

Function[结果,t_multi,t_single] = clientfasterthanpool(fcn,numout,varargin)%preallocate用于输出的单元格数组输出=单元格(NUMOUT);% 客户t为了我= 1:200如果numout == 0 fcn(varargin {:});别的[输出{1:numout}] = fcn(varargin {:});结尾结尾t_multi = toc;% Parallel poolvararginC = parallel.pool.Constant(varargin); ticpar我= 1:200%preallocate用于输出的单元格数组输出=单元格(NUMOUT);如果numout == 0 fcn(vararginc.value {:});别的[outputs{1:numout}] = fcn(vararginC.Value{:});结尾结尾t_single = toc;%如果Multhreading更快,则返回true结果= t_single> t_multi;结尾

parParfeval.那およびSPMD.のパフォーマンスの比较

SPMD.のの用は,计算のタイプによってparループやParfeval.の使より遅い遅い速い速い速い速いますありありありありヘッドがヘッドががヘッドヘッドヘッドヘッドヘッドヘッドヘッドparループ、Parfeval.那およびSPMD.の相対的なパフォーマンスに影響します。

一連のタスクでは、通常、parおよびParfeval.は次の条件下でSPMD.より优れたパフォーマンスを示します。

  • タスクあたりの计算计算时空

  • タスクあたりの计算时间が一道でない。

  • 各タスクから返されるデータが小さい。

Parfeval.は次の場合に使用します。

  • 計算をバックグラウンドで実行する。

  • 各タスクが他のタスクに依存する。

この例では,parループ、Parfeval.那およびSPMD.をを用して行列が実実されるの速さをを调べ调べ

まず、ローカルの並列ループP.を作成します。

p = parpool('当地的');
使用“本地”配置文件启动并行池(Parpool)连接到并行池(工人数:6)。

乱数行列の計算

parループ、Parfeval.那およびSPMD.の生用によって数行列生成できる速さをます调べますます。N.的)と行列のサイズ (M.M.列の行列) を設定します。試行数を増やすと後の解析で使用する統計値が向上しますが、計算自体には影響しません。

m =1000;n =20.;

次に,parループを使使て,各ワーカーでrand(m)を1回実行します。N.回の试行について,それぞれの时间を测定します。

parfortime =零(n,1);为了我= 1:n tic;垫=细胞(1,p.numworkers);parn = 1:p.numworkers mats {n} = rand(m);结尾parfortime(i)= toc;结尾

次に,Parfeval.を使用して,各ワーカーでrand(m)を1回実行します。N.回の试行について,それぞれの时间を测定します。

parfevaltime = zeros(n,1);为了我= 1:n tic;f(1:p.numworkers)=并行.Fevalfuture;为了n = 1:p.numworkers f(n)= parfeval(@ rand,1,m);结尾mats = fetchOutputs(f,“统一输出”那False)'; parfevalTime(i) = toc; clearF结尾

最后に,SPMD.をを使し,各ラボでrand(m)を1回実行しラボ,およびSPMD.をを使ってラボラボでコマンドを実するするについてについてについてについてについてについてについてについてについてについてについて复数のデータセットで単一觉を参照してください。N.回の试行について,それぞれの时间を测定します。

spmdtime = zeros(n,1);为了我= 1:n tic;SPMD.e = rand(m);结尾eigenvals = {e {:}};spmdtime(i)= toc;结尾

rmoutliers.,boxplotを使用して時間を比較します。

% Hide outliersboxData = rmoutliers([parforTime parfevalTime spmdTime]);% Plot databoxplot(boxdata,'labels'那{“议定书”'Parfeval''spmd'},'Symbol'''的)ylabel('Time (seconds)'的)title('Make n random matrices (m by m)'的)

通讯,SPMD.にに必要な评価评価あたりのヘッドヘッド,parParfeval.より长くなります。このこの,この例では,parループまたはParfeval.をを用する方向が效率的です。

乱数行列和の

次に,乱数行列の和を計算します。これを行うには、parループでリダクション変数を,Parfeval.で計算後の和を、またはSPMD.gplusここ使使ます。ここここで,试行数(N.的)と行列のサイズ (M.M.列の行列) を設定します。

m =1000;n =20.;

次に,parループを使使て,各ワーカーでrand(m)を 1 回実行します。リダクション変数を使用して和を計算します。N.回の试行について,それぞれの时间を测定します。

parfortime =零(n,1);为了我= 1:n tic;结果= 0;parn = 1:p.numworkers结果=结果+ rand(m);结尾parfortime(i)= toc;结尾

次に,Parfeval.を使用して,各ワーカーでrand(m)を1回実行します。すべての行列fetchOutputs.をを用してから,を使用します。N.回の试行について,それぞれの时间を测定します。

parfevaltime = zeros(n,1);为了我= 1:n tic;f(1:p.numworkers)=并行.Fevalfuture;为了n = 1:p.numworkers f(n)= parfeval(@ rand,1,m);结尾result = sum(fetchOutputs(f)); parfevalTime(i) = toc; clearF结尾

最后に,SPMD.をを使し,各ラボでrand(m)を1回実行します。gplusをを使し,すべての行列を计ししをを最初のラボにのみのみするににはにににははにににtargetlab.1に设定します。N.回の试行について,それぞれの时间を测定します。

spmdtime = zeros(n,1);为了我= 1:n tic;SPMD.r = gplus(兰特(m),1);结尾结果= r {1};spmdtime(i)= toc;结尾

rmoutliers.,boxplotを使用して時間を比較します。

% Hide outliersboxData = rmoutliers([parforTime parfevalTime spmdTime]);% Plot databoxplot(boxdata,'labels'那{“议定书”'Parfeval''spmd'},'Symbol'''的)ylabel('Time (seconds)'的)title('Sum of n random matrices (m by m)'的)

この計算の場合、SPMD.parループやParfeval.より大厦に速くなります。parループループリダクションリダクション数ををとと,parループの各反復の結果がすべてのワーカーにブロードキャストされます。一方、SPMD.gplusををリダクション演算を実実ためためためなオーバーヘッドがよりなりなりなりなりなりなりなりなりなりなりなりなりなりリダクションなりなりなりなりなりなりなりリダクションリダクションリダクションリダクションリダクションますリダクションリダクションリダクションリダクションリダクションはヘッドリダクションリダクションリダクションリダクションヘッドリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクションリダクション计算计算计算计算ますヘッドヘッドヘッドヘッドヘッドヘッドヘッドヘッドヘッドヘッドヘッドヘッドSPMD. O. N. 2 的) par O. M. N. 2 的) です。

参考

||

关键词する