2017-12-14 10 views
0

MPI指令を使用して最適化ルーチンを並列化しようとしています。プログラムの構造は、本文の最後のブロック図におおよそ似ています。データは最適化ルーチンに送られ、Objective関数サブルーチンと別のサブルーチンが呼び出され、 "Jacobian"という行列が計算されます。最適化ルーチンは、Objective関数の最小値に達するのに必要な回数だけ反復し、結果で終了します。ヤコビ行列は、最小値がどの方向にあるかを決定し、その方向に一歩踏み出すために使用されます。私は最適化ルーチンを制御できません。目的関数とヤコビ行列を計算する関数のみを提供します。ほとんどの時間はヤコビ行列の計算に費やされます。ヤコビ行列の各行列要素は他の要素とは独立しているため、並列化のための良い候補と思われます。しかし、私はこれを達成することができませんでした。当初は、ヤコビ行列の計算を多数のノードにわたって分散することができると考えていました。各ノードは、行列要素の一部だけを計算します。私はそれをしましたが、たった1回の繰り返しの後、ノード上のすべてのスレッドが終了し、プログラムが停止します。私は、最適化ルーチンのソースコードがなければ、これは可能でないかもしれないと考え始めています。その理由は、コードを複数のノードに分散し、ヤコビ行列の一部を計算するように指示して、マスタを除いてすべてのノードで最適化を行うからです。 MPIを使用し、最適化ルーチンでコードに触れることなく、その周りに道がありますか?ヤコビ行列を計算する関数だけが、マスターを除くすべてのノードで実行できますか?あなたはどうしますか?MPIによる数値最適化

blockdia

+0

あなたの目的関数の偏微分を記号的に取ってヤコビ行列を計算していますか?あなたの現在の推測で最適な入力ベクトルを評価しますか、現在の推測の周りの小さな偏差に対して目的関数を評価して数値的に計算しますか? ? – lockcmpxchg8b

+0

@ lockcmpxchg8b Theresは目的関数の解析式ではないので、数値的に導関数を計算します。計算は時間がかかり、時間がかかるので、私はそれらを並列化しようとしています。 MPIは良い候補のように見えましたが、最適化ルーチンのソースコードにアクセスすることができないので、このケースではうまくいくとは思えません。おそらく私は自分のORを書く必要があります。 – Plamenk

+0

@ハイパフォーマンスマークご提案いただきありがとうございます。そこに質問を投稿するかもしれませんが、パフォーマンス上ではなく、アルゴリズムに焦点が当てられているように見えます。 – Plamenk

答えて

0

それは思ったよりも簡単になりました。この質問で説明したように、ワーカースレッドは1回の反復の後に終了していました。解決策は、ワーカーが実行したヤコビアンの計算でコードを無限のwhileループで囲むだけで、終了時にメインスレッド(マスター)からメッセージを送信することでそれを打ち破ることです。

関連する問題