use crate::distributed::{
DistributedCommunicator, DistributedCoordinator, LoadBalancer,
config::DistributedConfig, stats::DistributedStats
};
use crate::error::LinalgResult;
pub struct DistributedContext {
pub config: DistributedConfig,
pub communicator: DistributedCommunicator,
pub coordinator: DistributedCoordinator,
pub load_balancer: LoadBalancer,
pub stats: DistributedStats,
}
impl DistributedContext {
pub fn new(config: DistributedConfig) -> LinalgResult<Self> {
let communicator = DistributedCommunicator::new(&config)?;
let coordinator = DistributedCoordinator::new(&config)?;
let load_balancer = LoadBalancer::new(&config)?;
let stats = DistributedStats::new();
Ok(Self {
config,
communicator,
coordinator,
load_balancer,
stats,
})
}
pub fn finalize(mut self) -> LinalgResult<DistributedStats> {
self.coordinator.barrier()?;
self.communicator.finalize()?;
Ok(self.stats)
}
pub fn get_stats(&self) -> &DistributedStats {
&self.stats
}
pub fn update_stats(&mut self, update: impl FnOnce(&mut DistributedStats)) {
update(&mut self.stats);
}
}
#[allow(dead_code)]
pub fn initialize_distributed(config: DistributedConfig) -> LinalgResult<DistributedContext> {
DistributedContext::new(config)
}
#[allow(dead_code)]
pub fn finalize_distributed(context: DistributedContext) -> LinalgResult<DistributedStats> {
context.finalize()
}