主要内容

parallel.pool.DataQueue

クラアントとワカの間でのデタの送信とリスニング

    説明

    DataQueueにより,計算の実行中に並列プール内のワーカーからクライアントにデータまたはメッセージを非同期で送り返すことができます。たとえば,計算の中間値と進行状況の指標を取得できます。

    並列プルのワカからクラアントにデタを送り返すにはまずクラアント内にDataQueueを作成します。このDataQueueを,parforル,プ,またはspmdなどの他の並列言語構成に渡します。ワ,カ,から发送を呼び出して,デ,タをクラ,アントに送り返します。クラ@ @アントで,デ@ @タを受信するたびに呼び出される関数をafterEachを使用して登録します。

    • 必要に応じて,DataQueueを作成するワカまたはクラアントから发送を呼び出すことができます。

    • ワーカー上にキューを作成し,そのキューをクライアントに送り返すことにより,逆方向の通信を有効にできます。ただし,ワカから別のワカにキュを送信することはできません。ワ,カ,間でデ,タを転送するには,代わりにspmdspmdSendまたはspmdReceiveを使用してください。

    • その他すべてのハンドルオブジェクトとは異なり,DataQueueンスタンスとPollableDataQueue

    作成

    説明

    = parallel.pool.DataQueueは,さまざまなワーカーからのメッセージ(またはデータ)の送信またはリスニングに使用できるオブジェクトを作成します。デ,タを受信するワ,カ,またはクラ,DataQueueを作成します。

    プロパティ

    すべて展開する

    このプロパティは読み取り専用です。

    キュからの削除待のデタアテム数。0または正の整数として指定します。値は0か,またはPollableDataQueue。クラ@ @アントがPollableDataQueueインスタンスを作成する場合,値はすべてのワーカー上で0です。いずれかのワ,カ,がPollableDataQueueを作成する場合,値はクラアント上およびその他すべてのワカ上で0です。

    オブジェクト関数

    afterEach DataQueueで新規デ,タを受信したときに呼び出す関数の定義
    发送 デタキュを使用したクラアントからワカへのデタの送信

    すべて折りたたむ

    DataQueueを作成し,afterEachを呼び出します。

    q = parallel.pool.DataQueue;afterEach (q, @disp);
    parforル,プを開始し,メッセ,ジを送信します。保留中のメッセ,ジ(この例では@disp)が関数afterEachに渡されます。

    parforI = 1:3 send(q, I);结束
    1 2 3

    DataQueueによるデタのリスニングの詳細にいては,afterEachを参照してください。

    メッセ,ジを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

    キュは空であるため,クラアントとワカの両方でQueueLength0です。次に,ワ,カ,からキューにメッセージを送信します。続いて、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

    キュ,の処理が完了しているため,QueueLength0です。

    この例では,DataQueueを使用して,parforルプの進行状況に合わせてウェトバを更新します。

    parforル,プを作成するときに,各反復を並列プ,ル内のワ,カ,にオフロ,ドします。ワ,カ,から情報が返されるのは,parforル,プが完了したときのみです。DataQueueを使用すると,各反復の最後にウェ。

    parforループの進行状況に合わせてウェイトバーを更新する場合,クライアントは残りの反復回数に関する情報を記録しなければなりません。

    ヒント

    新しい並列コ,ドを作成しているときにコ,ドの進行状況を監視する場合は,parfevalワ,クフロ,の使用を検討してください。詳細にいては,afterEachと毕竟を使用したユーザーインターフェイスの非同期更新を参照してください。

    この例の最後に定義されている補助関数parforWaitbarによって,ウェ。この関数は,持续的を使用して,残りの反復回数に関する情報を保存します。

    waitbarを使用して,ウェwを作成します。

    W = waitbar(0,“请稍等……”);

    DataQueueDを作成します。次に,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により実行し,その結果を計算中にDataQueueオブジェクトによって戻す方法を示します。

    parfevalはmatlabをブロックしないため,計算の実行中に作業を続行できます。

    この例では,ロレン常微分方程式系のパラメタ σ および ρ に対してパラメタスプを実行し,この系のカオス的性質を説明します。

    d d t x σ y - z d d t y x ρ - z - y d d t z xy - β x

    パラメ,タ,グリッドの作成

    パラメタスプで調べるパラメタの範囲を定義します。

    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で導入