質問

私は現在、ユーザー定義された式の100Sを含めることができるアプリケーションを持っています。現在、私は(そして、スタックからそれらをポップと評価し、スタックに上の値や変数を押して)計算を実行するために逆ポーランド記法を使用しています。このプロセスを並列起動するための最良の方法は何でしょうか?私は関数型言語を見てすべきですか?

例えば、単純なA + Bは、実際に追加の100Sを意味することができるように、

の計算は、数値のアレイ上で行われます。私は現在のDelphiを使用していますが、これは今後必須ではありません。私は仕事に最も適したツールを使用します。式はまた、それで、我々は1つの式C = A + Bと、例えば第1 D = C + Aを有していてもよく、互いに依存してもよいです。

役に立ちましたか?

解決

のは、あなたの式(方程式)を想定してみましょうそうでなければ、「ただ」それらを評価することができないとして、巡回ではありません。あなたはA、BとCが配列されているA = B + Cのような方程式をベクトル化している場合は、配列のサイズが5であれば、この式は、

に分割されるように、のは、概念的に、コンポーネント上の方程式にそれらを分割してみましょう
a1 = b1 + c1
a2 = b2 + c2
...
a5 = b5 + c5

今、あなたは、単純な量(整数、合理的または何か他のものかどうか)上の方程式の大規模なセットを持って、これを想定しています。

あなたは二つの式EとFを持っている場合は、のは、FはE depends_on Fの右側には、例えば、Eの左側に言及している場合としましょう。

E: a = b + c
F: q = 2*a + y

さて、これを計算する方法に向けて取得するには、あなたは常にこのアルゴリズム以下、(これは説明でちょうど中間段階である)、これを解決するために、ランダム化の繰り返しを使用することができます:

1 while (there is at least one equation which has not been computed yet)
2   select one such pending equation E so that:
3     for every equation D such that E depends_on D:
4       D has been already computed
5   calculate the left-hand side of E

このプロセスは、今クールの事は、それはまた、簡単に並列化することであるにかかわらず、あなたが行// 2.あなたの選択を行う方法についての正しい答えで終了します。あなたは、スレッドの任意の数でそれを実行することができます!何が必要な前提条件(これらの方程式が依存)が計算されていますが、まだ自分自身を計算していない、これらの方程式を保持している同時実行セーフなキューです。すべてのスレッドは、一度に(スレッド安全に)このキューから1つの方程式を飛び出す答えを計算し、新しい方程式は、今がある場合すべての前提条件が計算されているようにチェックし、次にそれらの方程式(スレッド・安全)を追加します作業キューへ。完了ます。

他のヒント

より多くを知らなくても、私は可能であればSIMDスタイルのアプローチを取ることをお勧め。これは、単一のデータ・セットのすべての数式を計算するためにスレッドを作成しています。権利を取得するために書くことは難しいだろうスレッドに適した個別の単位に計算を分割できるようにするために必要なロジックだけ速度の向上が得られないであろう、それらを並列化する数式の計算を分割しようとすると困難は、オーバーヘッドがキャンセルになります任意の速度の向上アウト。また、収穫逓減からすぐに苦しむでしょう。

あなたは多くのデータセットに適用されている式の集合を持っている場合は、

さて、その後、並列化が容易になり、より優れたスケーラビリティでしょう。各スレッドは、データの1セットのすべての計算を行います。 CPUコアごとに1つのスレッドを作成し、各コアへの親和性を設定します。各スレッドは、式の評価のコードの1つのインスタンスをインスタンス化します。単一のデータ・セットをロードし、それをアイドル状態のスレッドを渡しスーパーバイザを作成します。何のスレッドがアイドル状態でない場合は、そのデータの処理を完了するために最初のスレッドを待ちます。すべてのデータ・セットが処理され、すべてのスレッドが終了し、その後、終わったら。この方法を使用して、何の利点は、スレッド切り替えが遅く、全体的な速度にマイナスの影響を与えるようにCPU上のコアが存在するよりも多くのスレッドを有することはありません。

あなたが唯一の1つのデータセットを持っていれば、

それは簡単な作業ではありません。これは、他の枝に依存関係なしに支店のための評価ツリーを解析し、別のスレッドが各コア上で実行し、結果を待っているにそれらの枝を農業が必要となります。その後、問題のデータを同期してデータの一貫性を確保することを取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top