ループ内にループのパターンがある
大ループと小ループの変数は、内側のループのループ本体で使用する必要があります。
ここでは単純なモデルに簡略化しました。
関数が複雑な場合、このモデルは非常に遅くなります。
マルチプロセス手法を使用して速度の問題を解決する方法を聞きたいのですが?
私のアイデアは、小さなループにのみマルチプロセスを使用することです。
大きなループのループ本体にマルチプロセスのコードを記述します。
しかし、失敗し続けます。
神にお願いしてください。正しいコード。
###ありがとう!
リーリー
まず第一に、並列コンピューティングでは、各並列演算のサブルーチン間に相互の因果関係がないことが必要です。
小さなループでは、res は x、y、z、alist、blist、clist と密接な因果関係があり、それらを並列計算に分割するのは困難です。
質問者が投稿したコードはオリジナルのコードではないため、オリジナルのコードにある大きなループに因果関係があるかどうかはわかりませんが、回路図のコードから判断すると、
大きなループをN個のスレッドに分割します。 (プロセスは必要ありません)、「はい、各スレッドは 2000/N 回計算します」となるはずです。
たとえば、8 つのスレッドに分割され、スレッド 1 は i=0 ~ 249 を計算し、スレッド 2 は i=250 ~ 499 を計算します。 。 。
ここでの N のサイズは、CPU コアの数に応じて決定できます。N が CPU コアの数を超えると、あまり意味がありませんが、効率が低下する可能性があります。
途中でelifを使用する必要があります。最後のforのインデントに問題があるようです
大きなループで複数のプロセスを開くことができます。たとえば、大きなループが 2000 回の場合、CPU コアの数が 4 の場合、4 つのプロセスが開かれ、各プロセスは 500 の実行を担当します
小さなループが終了したら、サブスレッドを開いて次の後続の操作を実行でき、大きなループは前方に処理を続けます
リーリーサブプロセスを使用して小さなループを処理できますが、この場合は 2 つの大きなループが必要です。 1 つのループは小さなループを処理し、このループが処理された後、大きなループは次のことを処理します
こんな感じ
リーリー小さなループで実行される関数に時間がかかる場合は、プロデューサー/コンシューマー モデルを検討できます
リーリー質問者はプロセスの入力と出力を最初に設計する必要がありますか? 複数のプロセスが並列計算を行う場合、プロセス間の通信が最も重要です。それは、多層ループなどの MPI である必要があります。のデータを最初に分散する必要があります。各プロセスは計算を行ってからデータ統合ポイントに戻り、結果をマージして出力します。
もう一つ重要な点は、各プロセスの実行時間を見積もることです。結局のところ、プロセス間通信がある場合、待ち時間も効率の低下につながります。
@daijianke さんは、あなたのネストは並列計算の入力規則に準拠していないと言いました。この例を見てください。
http://blog.csdn.net/zouxy09/... 以前に記事内の例をテストしましたが、次の手順に従えば問題なく実行できるはずです。