From aeac483bacd2ed6070a611631f9ee127e79f8018 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Sat, 19 Mar 2022 15:51:07 +0100 Subject: [PATCH] parallel simulation of economies --- common/src/store.rs | 10 ++++++++++ world/src/sim2/mod.rs | 12 +++++++----- world/src/site/economy/mod.rs | 2 ++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/common/src/store.rs b/common/src/store.rs index 7c03577d7d..99b2f37d36 100644 --- a/common/src/store.rs +++ b/common/src/store.rs @@ -1,3 +1,4 @@ +use rayon::prelude::*; use std::{ cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd}, fmt, hash, @@ -85,6 +86,15 @@ impl Store { } } +impl Store { + pub fn par_iter_mut(&mut self) -> impl ParallelIterator, &mut T)> { + self.items + .par_iter_mut() + .enumerate() + .map(|(idx, obj)| (Id(idx as u64, PhantomData), obj)) + } +} + impl Index> for Store { type Output = T; diff --git a/world/src/sim2/mod.rs b/world/src/sim2/mod.rs index 7bcaa6b45c..1d8876564e 100644 --- a/world/src/sim2/mod.rs +++ b/world/src/sim2/mod.rs @@ -9,6 +9,7 @@ use crate::{ }, Index, }; +use rayon::prelude::*; use tracing::{debug, info}; const TICK_PERIOD: f32 = 3.0 * DAYS_PER_MONTH; // 3 months @@ -236,19 +237,20 @@ fn check_money(index: &mut Index) { ); } -pub fn tick(index: &mut Index, _world: &mut WorldSim, dt: f32, mut vc: vergleich::Context) { +pub fn tick(index: &mut Index, _world: &mut WorldSim, dt: f32, _vc: vergleich::Context) { if INTER_SITE_TRADE { // move deliverables to recipient cities for (id, deliv) in index.trade.deliveries.drain() { index.sites.get_mut(id).economy.deliveries.extend(deliv); } } - for (site_id, site) in index.sites.iter_mut() { + index.sites.par_iter_mut().for_each(|(site_id, site)| { if site.do_economic_simulation() { - site.economy - .tick(site_id, dt, vc.context(&site_id.id().to_string())); + site.economy.tick(site_id, dt, vergleich::Context::dummy()); + // helpful for debugging but not compatible with parallel execution + // vc.context(&site_id.id().to_string())); } - } + }); if INTER_SITE_TRADE { // distribute orders (travelling merchants) for (_id, site) in index.sites.iter_mut() { diff --git a/world/src/site/economy/mod.rs b/world/src/site/economy/mod.rs index 0df0540658..f747a55944 100644 --- a/world/src/site/economy/mod.rs +++ b/world/src/site/economy/mod.rs @@ -43,6 +43,8 @@ pub mod vergleich { pub fn context(&mut self, _: &str) -> Context { Context {} } pub fn value(&mut self, _: &str, val: f32) -> f32 { val } + + pub fn dummy() -> Self { Context {} } } }