0

私は非常に厳しい要件を持つ C のWa-torシミュレーターに取り組んでおり、同じ引数を持つ呼び出し間で再現可能な動作を適切に取得する方法について少し混乱しています。

Wa-tor は基本的に、水、魚、またはサメのみを含むことができるセルの 2D 配列です。

私が持っているものは次のとおりです(問題を理解するために興味深いものだけをリストしようとします):

  • ユーザーが他のオプションの中で整数シードを指定できる構成ファイル
  • 構成ファイルを解析し、ユーザーが要求した数のワーカー サブプロセスを生成 (fork+execve) するマスター プロセス。さらに、単一の大きなグリッドとして表示するすべてのワーカーからステータスを収集します。ワーカーは、UNIX ソケット ファイルを介してマスターと通信します。
  • 多くのマルチスレッド (pthread) ワーカー プロセス。

ワーカーはマスター ソケットに接続し、ユーザーが指定したシードを含むシミュレーション パラメーターを受け取ります (現時点では、シードはワーカー ID を追加するワーカー間で区別されます。ワーカー ID は、マスターが再現可能にワーカーに割り当てる連続番号であり、 execve のコマンド ラインに含まれているため、ワーカーはマスターのソケットへの接続時に識別でき、毎回同じグリッド セクションに割り当てられます)。

ワーカーはサブグリッドをランダムに初期化してマスターに送信し、隣接するワーカーとの間で境界値を送受信します。

これからの労働者の状態は、クロノンと呼ばれる離散的なステップで進化します。各ステップで、ワーカーはサブグリッドの各クリーチャーのランダム アクションを計算し、隣接するワーカーおよびマスターと更新を交換します。

1 つのスレッドがシグナルをリッスンし、別のルーチンが「シミュレーション」部分を処理します。このシミュレーション ルーチンは、各ステップの最後に、隣接するスレッドに更新を送信するために 4 つの他のスレッドを生成し、更新を受信するために 4 つ、マスターにステータスを送信するために 1 つを生成します。このスレッドは、次のステップを開始する前に結合されます。

乱数の生成を処理するために私が現在行っていることは、グローバルな「unsigned int SEED」を用意することです。これには、ワーカー プロセスの開始時に (スレッドが生成される前に) マスターから受け取った値が提供されます。 、「extern」キーワードを使用して必要なすべてのファイルに含まれています。そのため、「rand_r(&SEED)」の呼び出しでそのアドレスを使用します。

最初の問題は、rand_r の呼び出し後に SEED の値が更新されないことです。代わりに、シングル スレッド アプリケーションの実行を観察できます。私は何を忘れていますか?

次に、rand_r が異なるスレッドによって呼び出される可能性があること、およびワーカー間の通信が厳密な順序に従わないため、アクションのシーケンスが変更される可能性があることを認めて、グローバル変数が再現可能なシーケンスを取得するための正しい方法であるかどうかを尋ねています。 -そうでない場合、単一の整数値をシードとして開始する方法は何ですか? 要件は、同じ正確なパラメーターとシードから始めて、2 つの実行がステップごとに同じ結果を生成することです (立派なシミュレーターのように、私は推測します:)

Ps drand48_r() に切り替えることを考えていますが、スープは同じだと思います。

よろしくDR

4

1 に答える 1