6

共有メモリ モデルを使用して、時間の経過に伴う数十万のオブジェクトの相互作用をシミュレートするシングル スレッド アプリケーションがあります。
明らかに、マルチ CPU ハードウェアに拡張できないという問題があります。

エージェントベースのモデリングと関数型プログラミング/アクターモデルについて少し読んだ後、メッセージパッシングパラダイムで書き直すことを検討していました。

アイデアは非常に単純です。各オブジェクトがアクターになり、それらの相互作用がメッセージになり、シミュレーションが並行して行われるようになります。特定の時点でのオブジェクトの構成が与えられると、その将来の結果は簡単に計算できます。

問題は、時間をどのようにモデル化するかです。
たとえば、アクターとメッセージの計算順序が保証されていないため、オブジェクト X の動作が A と B に依存すると仮定しましょう。X が計算されるときに、A はすでに送信されている可能性があります。そのメッセージは X に送信されましたが、B には送信されませんでした。計算が正しく行われるようにする方法は?

質問が明確であることを願ってい
ます。

4

1 に答える 1

9

メッセージ パッシングを使用して (離散イベント?) シミュレーションを並列化するアプローチはよく知られており、関数型スタイル自体は必要ありません (ただし、もちろん、そのように実装することを妨げるものではありません)。

イベントのタイミングに関してあなたが説明する基本的な問題は、ローカル因果関係制約としても知られています(たとえば、この教科書を参照してください)。基本的に、同期プロトコルを使用して、各オブジェクト (またはエージェント) がそのメッセージを正しい順序で処理するようにする必要があります。並列離散イベント シミュレーションの領域では、このようなオブジェクトは論理プロセスと呼ばれ、イベント (つまり、タイムスタンプ付きメッセージ) を介して通信します。

これらのイベントの同期プロトコルを正しく実装することは困難であり、プロトコルの正しい選択はアプリケーションに大きく依存します。たとえば、重要な要素の 1 つは、イベントごとに必要な計算の平均量です。必要な計算がほとんどない場合、通信コストが実行時間全体を支配し、シミュレーションのスケーリングが難しくなります。

したがって、ゼロから始める前に、使用する予定のアクター フレームワークの上にある既存のソリューション/ライブラリを探すことをお勧めします。

于 2012-11-25T20:26:13.583 に答える