1

Matlab でパープールを使用しようとしています。

次のコードを使用してプールを開始し、選択したスクリプトを実行していますが、しばらくすると、プールが終了するという通知が表示されます。

以下は基本的に、コードが実行されているコンピューターを確認し、ワーカーの数を適切に割り当てます。

if strcmp( getenv('COMPUTERNAME'),'EEN-PC144')
    parpool(4)
    pctRunOnAll sim_img144
elseif strcmp( getenv('COMPUTERNAME'),'EEN-PC78')
    parpool(16)
    pctRunOnAll sim_img
elseif strcmp( getenv('COMPUTERNAME'),'EEN-PC244')
    %parpool(1)
    %pctRunOnAll sim_img
end

並列プールのシャットダウン通知のスクリーン ショット:-

並列プールのシャットダウン通知のスクリーン ショット

複数のコンピューターとその複数のコアで一連のシミュレーションを実行しようとしています。シミュレーションは行ごとに行われるため、前の行に依存する必要はありません。シミュレーション スクリプト自体を投稿することもできますが、それは 300 行の長さであり、その一部を独自のスクリプトに分割しました。これは、より多くのコード行を意味します。

私が使用しているシミュレーション パッケージ (FieldII) は、シミュレーションが parfor で行われると気に入りません。したがって、pctRunOnAll コマンドを使用している理由です。私は、おそらくそれを機能させた他の人によって機能するはずだと信じるようになりました。

追加の労働者が働くことを決定せず、何もせずに座っている理由はありますか? プロセスでは、作業中のワーカーが 1 つしかないことがわかりますが、16 人のワーカーすべてが初期化されていることがわかります。

スクリーンショットを処理します:-スクリーンショットを処理する

sim_img と sim_imm144 はまったく同じ厳密です。Matlabには最新バージョンを自動保存および自動ロードする機能があるため、sim_imgをコピーして名前を変更しました。したがって、一方のコンピューターでスクリプトに実験的な違いを加えると、それは自動的に保存され、もう一方のコンピューターに読み込まれます。そのため、仕事を失わないようにするための保険として、各コンピューターで 2 つの同一のスクリプトを実行しています。

sim_img(144) スクリプトは FieldII をロードします。次に、残りのコードをカプセル化する巨大な for ループがあります。for ループは、実行するシミュレーションと結果を保存するディレクトリを選択します。求める内容に応じて、シミュレータに初期化データを適用する if ステートメントと for ステートメントがいくつかあります。すべての設定が完了したので、結果ファイルがその行に対して書き込まれたかどうかを確認することで、データ行が処理されているかどうかを確認します。そうでない場合は、ファイルを作成してその行にファイルを事前に割り当てます。次に、現在の行に関連する初期化の最後のビットを実行し、その行のシミュレーションを開始します。ラインのシミュレーション後、事前に割り当てられたファイルにデータを書き込み、戻って別のラインをシミュレートする必要があるかどうかを確認します。

私の知る限り、スクリプト全体のコピーを各ワーカーにロードしていて、各ワーカーがスクリプト全体を実行していると思うので、コードの構造は問題ではありません。並列化できるのは、現在の行の結果ファイルが存在するかどうかを確認し、存在しない場合は事前に割り当てられているという事実です。私は現在、現在のシミュレーションで並行して動作している2台のコンピューターを持っています.parpoolにやらせようとしているのと本質的に同じです。

だから私が尋ねる質問は、追加の労働者がアイドル状態になる理由はありますか?

できるだけ多くの関連情報を追加しようとしました。

4

1 に答える 1

0

並列ワーカーを使用してさまざまな種類の計算を行い、HDD への読み取りと書き込みの遅延が問題であるという結論に達しました。ワーカーは、誰がどのイテレーションを行っているかについて互いに争っていたので、これによりすべてのイテレーションが完了したと考えました。HDD はネットワーク ドライブであり、時々少し奇妙な動作をします。すべきではありませんが、そうです。

これを機能させるために私ができるさまざまなボッジがあります。私が選んだ方法は、ワーカーごとに時間遅延を設定することでした。シミュレーションの最初のバッチでクラッシュが発生しないようにするために、各ワーカー間で 2 秒の遅延を設定しました。

いくつかの完全なシミュレーションを行ったところ、完全に機能しました。私は 32 個のワーカーを使用してきましたが、並列処理によってシミュレーション時間が約 90 ~ 95% 短縮されたため、すべてのワーカーが動作するまで最大約 1 分待つことは許容範囲を超えています。完璧ではありませんし、最も効率的でもありませんが、機能します。

于 2016-07-05T18:53:59.460 に答える