parallel.pool.DataQueue
クラアントとワカの間でのデタの送信とリスニング
説明
DataQueue
により,計算の実行中に並列プール内のワーカーからクライアントにデータまたはメッセージを非同期で送り返すことができます。たとえば,計算の中間値と進行状況の指標を取得できます。
並列プルのワカからクラアントにデタを送り返すにはまずクラアント内にDataQueue
を作成します。このDataQueue
を,parfor
ル,プ,またはspmd
などの他の並列言語構成に渡します。ワ,カ,から发送
を呼び出して,デ,タをクラ,アントに送り返します。クラ@ @アントで,デ@ @タを受信するたびに呼び出される関数をafterEach
を使用して登録します。
必要に応じて,
DataQueue
を作成するワカまたはクラアントから发送
を呼び出すことができます。ワーカー上にキューを作成し,そのキューをクライアントに送り返すことにより,逆方向の通信を有効にできます。ただし,ワカから別のワカにキュを送信することはできません。ワ,カ,間でデ,タを転送するには,代わりに
spmd
、spmdSend
またはspmdReceive
を使用してください。その他すべてのハンドルオブジェクトとは異なり,
DataQueue
ンスタンスとPollableDataQueue
。
作成
説明
は,さまざまなワーカーからのメッセージ(またはデータ)の送信またはリスニングに使用できるオブジェクトを作成します。デ,タを受信するワ,カ,またはクラ,问
= parallel.pool.DataQueueDataQueue
を作成します。
プロパティ
QueueLength
- - - - - -現在キュに保持されているアテムの数
0または正の整数
このプロパティは読み取り専用です。
キュからの削除待のデタアテム数。0または正の整数として指定します。値は0
か,またはPollableDataQueue
。クラ@ @アントがPollableDataQueue
インスタンスを作成する場合,値はすべてのワーカー上で0
です。いずれかのワ,カ,がPollableDataQueue
を作成する場合,値はクラアント上およびその他すべてのワカ上で0
です。
例
parfor
ル,プでのメッセ,ジの送信,およびキュ,でのメッセ,ジのディスパッチ
DataQueue
を作成し,afterEach
を呼び出します。
q = parallel.pool.DataQueue;afterEach (q, @disp);
parfor
ル,プを開始し,メッセ,ジを送信します。保留中のメッセ,ジ(この例では@disp
)が関数afterEach
に渡されます。
DataQueue
の長さを求める
メッセ,ジをDataQueue
オブジェクトに送信すると,メッセ,ジはリスナ,によって処理されるまでキュ,で待機します。メッセ,ジごとに,キュ,の長さに1
が加算されます。この例では,QueueLength
プロパティを使用してDataQueue
オブジェクトの長さを求めます。
いずれかのクラアントまたはワカがDataQueue
オブジェクトを作成すると,キューに送信されたすべてのメッセージはそのクライアントまたはワーカーのメモリに保持されます。クラ@ @アントがDataQueue
オブジェクトを作成する場合,すべてのワ,カ,上のQueueLength
プロパティは0
です。この例ではクライアント上にDataQueue
オブジェクトを作成し,ワ,カ,からデ,タを送信します。
。
parpool (1);
使用“本地”配置文件启动并行池(parpool)…连接到并行池(工人数:1)。
次に,DataQueue
を作成します。
q = parallel.pool.DataQueue
q =属性:QueueLength: 0的数据队列
新規に作成されたDataQueue
には空のキュ,があります。parfor
を使用して,ワ,カ,上のq.QueueLength
を求めることができます。クラ。
流('在客户端:%i\n'q.QueueLength)
客户端:0
parforI = 1 fprintf(工人:%i\nq.QueueLength)结束
工人:0
キュは空であるため,クラアントとワカの両方でQueueLength
は0
です。次に,ワ,カ,からキューにメッセージを送信します。続いて、QueueLength
プロパティを使用してキュ,の長さを求めます。
先发消息parforI = 1 send(q,“消息”);结束计算长度流('在客户端:%i\n'q.QueueLength)
客户端:1 .单击“确定”
parforI = 1 fprintf(工人:%i\nq.QueueLength)结束
工人:0
QueueLength
プロパティはクラ@ @アントで1
であり,ワ,カ,で0
です。デタをただに表示してキュを処理するリスナを作成します。
el = afterEach(q, @disp);
キュ,が空になるまで待ってから,リスナ,を削除します。
而q.QueueLength > 0暂停(0.1);结束删除(el);
QueueLength
プロパティを使用して,キュ,の長さを求めます。
流('在客户端:%i\n'q.QueueLength)
客户端:0
キュ,の処理が完了しているため,QueueLength
は0
です。
DataQueue
オブジェクトとparfor
を使用したウェ▪▪トバ▪▪の更新
この例では,DataQueue
を使用して,parfor
ルプの進行状況に合わせてウェトバを更新します。
parfor
ル,プを作成するときに,各反復を並列プ,ル内のワ,カ,にオフロ,ドします。ワ,カ,から情報が返されるのは,parfor
ル,プが完了したときのみです。DataQueue
を使用すると,各反復の最後にウェ。
parfor
ループの進行状況に合わせてウェイトバーを更新する場合,クライアントは残りの反復回数に関する情報を記録しなければなりません。
ヒント
新しい並列コ,ドを作成しているときにコ,ドの進行状況を監視する場合は,parfeval
ワ,クフロ,の使用を検討してください。詳細にいては,afterEachと毕竟を使用したユーザーインターフェイスの非同期更新を参照してください。
この例の最後に定義されている補助関数parforWaitbar
によって,ウェ。この関数は,持续的
を使用して,残りの反復回数に関する情報を保存します。
waitbar
を使用して,ウェw
を作成します。
W = waitbar(0,“请稍等……”);
DataQueue
、D
を作成します。次に,afterEach
を使用して,メッセ,ジがDataQueue
に送信された後にparforWaitbar
を実行します。
创建数据队列和监听器D = parallel.pool.DataQueue;afterEach (D, @parforWaitbar);
parfor
ル,プの反復回数N
を設定します。ウェトバw
と反復回数N
を使用して関数parforWaitbar
を初期化します。
parfor
ルプの反復が終了するたびに,クラアントはparforWaitbar
を実行してウェ▪▪トバ▪▪を増分更新します。
N = 100;parforWaitbar (w, N)
関数parforWaitbar
は永続変数を使用して,完了した反復の数をクラ。ワ,カ,からの情報は必要ありません。
parfor
ル,プを反復回数N
で実行します。この例では,暂停
と兰德
を使用していくかの作業をシミュレトします。反復が終了するたびに,发送
を使用してDataQueue
にメッセ,ジを送信します。メッセ,ジがDataQueue
に送信されると,ウェ。ワ,カ,からの情報は必要ないため、不要なデータ転送を避けるために空のメッセージを送信します。
parfor
ル,プが完了したら,删除
を使用してウェ▪▪トバ▪▪を閉じます。
parfori = 1:N pause(rand) send(D,[]);结束删除(w);
補助関数parforWaitbar
を定義します。入力引数を2指定して関数parforWaitbar
を実行すると,3の永続変数(数
、h
およびN
)が初期化されます。入力引数を1指定してparforWaitbar
を実行すると,ウェ。
函数parforWaitbar (waitbarHandle、迭代)持续的计数h N如果Nargin == 2%初始化计数= 0;h = waitbarHandle;N =迭代;其他的更新等待栏检查句柄是否是已删除对象的引用如果(h) count = count + 1;waitbar(count / N,h);结束结束结束
parfeval
を使用したパラメタスプ中のプロット
この例では,並列パラメタスプをparfeval
により実行し,その結果を計算中にDataQueue
オブジェクトによって戻す方法を示します。
parfeval
はmatlabをブロックしないため,計算の実行中に作業を続行できます。
この例では,ロレン常微分方程式系のパラメタ および に対してパラメタスプを実行し,この系のカオス的性質を説明します。
パラメ,タ,グリッドの作成
パラメタスプで調べるパラメタの範囲を定義します。
gridSize = 40;sigma = linspace(5, 45, gridSize);rho = linspace(50,100, gridSize);Beta = 8/3;
関数meshgrid
を使用して,パラメ,タ,の2次元グリッドを作成します。
[rho,sigma] = meshgrid(rho,sigma);
图オブジェクトを作成し,“可见”
を真正的
に設定すると,このオブジェクトがラ。パラメタスプの結果を可視化するには,表面プロットを作成します。表面のZ
要素を南
で初期化すると,空のプロットが作成されることに注意してください。
图(“可见”,真正的);surface = surf(rho,sigma,NaN(size(sigma)));包含(‘\ρ,“翻译”,“泰克斯”) ylabel (‘\σ’,“翻译”,“泰克斯”)
並列環境の設定
関数parpool
を使用して並列ワ,カ,のプ,ルを作成します。
parpool;
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(工人数:6)。
ワ,カ,からデ,タを送信するには,DataQueue
オブジェクトを作成します。関数afterEach
を使用して,ワ,カ,がデ,タを送信するたびに表面プロットを更新する関数を設定します。関数updatePlot
は,この例の最後で定義するサポ,ト関数です。
Q = parallel.pool.DataQueue;afterEach (Q, @(数据)updatePlot(表面、数据));
並列パラメタスプの実行
パラメタを定義した後,並列パラメタスプを実行できます。
作業負荷を分散すると,parfeval
の効率性が向上します。作業負荷を分散するには,調べるパラメ,タ,をグル,プ化して分割します。この例では、コロン演算子(:
)を使用して,サ一步
として均等に分割します。この結果得られる配列分区
には,分割の境界が含まれます。最後の分割の終点を追加しなければならないことに注意してください。
Step = 100;分区=[1:步骤:数字(西格玛),数字(西格玛)+1]
分区=1×171101 201 301 401 501 601 701 801 901 1001 1101 1201 1301 1401 1501 1601
最良のパフォ,マンスを得るには,次のように分割するようにします。
分割のスケジュ,リングのオ,バ,ヘッドよりも計算時間が長くなる程度に大きい
すべてのワ,カ,をビジ,状態に維持するために十分な分割数が存在する程度に小さい
並列ワ,カ,での関数の実行を表し,その結果を保持するには,未来オブジェクトを使用します。
f(1:numel(partitions)-1) = parallel.FevalFuture;
関数parfeval
を使用して,計算を並列ワ,カ,にオフロ,ドします。parameterSweep
はこのスクリプトの最後で定義されている補助関数で,調べるパラメーターの分割についてのローレンツ系を解きます。これには出力引数が1あるため,parfeval
では出力の数として1
を指定しなければなりません。
为ii = 1:数值(分区)-1 f(ii) = parfeval(@parameterSweep,1,分区(ii),分区(ii+1),西格玛,rho,beta,Q);结束
parfeval
はmatlabをブロックしないため,計算の実行中に作業を続行できます。ワ,カ,は並列で計算を実行し,中間結果を使用できるようになったらDataQueue
によって送信します。
parfeval
が完了するまでMATLABをブロックする場合は,未来オブジェクトに対して関数等待
を使用します。この後のコードがparfeval
の完了に依存する場合,関数等待
を使用すると便利です。
等待(f);
parfeval
が計算を完了すると,等待
は終了し,さらにコ,ドを実行できるようになります。たとえば,結果として生成される表面の輪郭をプロットします。関数fetchOutputs
を使用して,未来オブジェクトに保存された結果を取得します。
results =重塑(fetchOutputs(f),gridSize,[]);contourf(ρ,σ,结果)包含(‘\ρ,“翻译”,“泰克斯”) ylabel (‘\σ’,“翻译”,“泰克斯”)
パラメ、タ、ス、プで計算リソ、スが多く必要で、クラスタ、にアクセス可能な場合は、parfeval
の計算をスケ,ルアップできます。詳細にいては,デスクトップからクラスタ,へのスケ,ルアップを参照してください。
補助関数の定義
調べるパラメ,タ,の分割のロ,レン,系を解く補助関数を定義します。DataQueue
オブジェクトで関数发送
を使用して,中間結果をmatlabクラescアントに送信します。
函数results = parameterscan (first,last,sigma,rho,beta,Q) results = 0 (last-first,1);为2 =第一:持续1 lorenzSystem = @ (t))(σ(ii) * ((2) - (1));A (1)*(rho(ii) - A (3)) - A (2);A (1)* A (2) - * A (3)];[t,a] = ode45(lorenzSystem,[0 100],[1 1 1]);Result = a(end,3);发送(Q, [ii,结果]);Results (ii-first+1) = result;结束结束
新しいデ,タを受け取った時点で表面プロットを更新する別の補助関数を定義します。
函数updatePlot(surface,data) surface. zdata (data(1)) = data(2);drawnow (“limitrate”);结束
バ,ジョン履歴
R2017aで導入
Matlabコマンド
次のmatlabコマンドに対応するリンクがクリックされました。
コマンドをmatlabコマンドウィンドウに入力して実行してください。Webブラウザ,はMATLABコマンドをサポ,トしていません。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。