質問
非常に計算量の多い並列アプリケーションを作成する予定がある場合、並列処理を最大限に活用するために、オブジェクト (クラス、構造体、またはその他) を設計する際にどのようなガイドラインを使用しますか。
私は、何かを作成し、それを処理する別のオブジェクトに渡すなど、ツリーのような構造を必要とするオブジェクトのツリーのようなグラフを解釈/コンパイルするアプリケーションを考えています。
初期の設計プロセスから何を考慮する必要がありますか?
解決
何かを作成し、それを処理のために渡す場合は、ほぼ確実に、次のものを利用するようにアプリケーションを設計できます。 メッセージパッシング そして オブジェクトの分離。
最初のステップは責任を特定すること、つまり誰が何を処理するのかを特定することです。箱に丸められる人は誰でも。
2 番目のステップは、ボックス間の情報フローを定義することです。つまり、A が X を生成する場合...誰がそれを消費しますか?
この 2 つのステップの後、次のようになります。 従業員を表す葉とメッセージを表す矢印を持つ単純なグラフ。 すべての矢印は、 依存関係の順序 (つまり、矢印が A から B に向かう場合は、B の前に A を実行する必要があります)。
これにより、どのアクションを並列化できるのか、どのアクションが実際に連続しているのかを、グラフィカルに見やすく表示しやすい方法で簡単に確認できるようになります。
次に、を実装するだけです パイプ できる構造 ワーカー間でメッセージを渡す これにより、すべての従業員に仕事のパイプラインが確保されます。
最後に:元の設計が完成したら、改善するためにそれをリファクタリングするのは比較的簡単です。たとえば、同じ作業を行うノードは作業 PIPES を共有して、構文アナライザーが「字句トークン」パイプから消費するようにしたり、ワーカーが他のワーカー パイプなどから作業を「盗む」ことができるように変更したりできます。
他のヒント
不変のデータ構造を大量に使用しても問題ない場合は、時間、入力、頭痛を大幅に節約できます。
Jorge Có rdobaが上記で説明したパターンは、1つのアプローチにすぎません。以下は必ず読む価値があります。
http://www.amazon.com/Patterns-Parallel-Programming-Software / dp / 0321228111
問題を分解する最良の方法については、データ間の依存関係に大きく依存します。たとえば、Master-WorkerやSingle Program Multiple Data(SPMD)などのパターンは、問題が発生してアプローチする場合に非常に単純なアプローチになる傾向があります。