public DistributedProgressTracker(InternalGraphManager graphManager) { var processes = graphManager.Controller.Configuration.Processes; var processid = graphManager.Controller.Configuration.ProcessID; var context = new OpaqueTimeContext <Pointstamp>(graphManager.ContextManager.MakeRawContextForScope <Pointstamp>("progress context")); // construct aggregator stage with unconnected output var aggregatorPlacement = new SingleVertexPerProcessPlacement(processes, 0); var aggregator = new Stage <ProgressUpdateAggregator, Pointstamp>(aggregatorPlacement, context, Stage.OperatorType.Default, (i, v) => new ProgressUpdateAggregator(i, v), "Aggregator"); var stream = aggregator.NewOutput(shard => shard.Output); aggregator.Materialize(); this.aggregator = aggregator.GetShard(processid); // construct consumer stage with unconnected input var consumerPlacement = new SingleVertexPerProcessPlacement(processes, 0); var consumer = new Stage <ProgressUpdateConsumer, Pointstamp>(consumerPlacement, context, Stage.OperatorType.Default, (i, v) => new ProgressUpdateConsumer(i, v, this.aggregator), "Consumer"); var recvPort = consumer.NewUnconnectedInput(shard => shard.Input, null); consumer.Materialize(); this.consumer = consumer.GetShard(processid); // connect aggregators to consumers with special progress channel this.progressChannel = new ProgressChannel(aggregatorPlacement.Count, this.consumer, stream.StageOutput, recvPort, graphManager.Controller, graphManager.AllocateNewGraphIdentifier()); stream.StageOutput.AttachBundleToSender(this.progressChannel); Logging.Progress("Distributed progress tracker enabled"); }
public LoopContext(OpaqueTimeContext <T> s, string name) { externalContext = s.Context; if (this.externalContext.HasReporting && this.externalContext.Manager.RootStatistics.HasInline) { internalContext = externalContext.Manager.MakeContextForScope <IterationIn <T> >( externalContext.Scope + "." + name, new ReportingEgressStage <T>(externalContext)); } else { internalContext = externalContext.Manager.MakeContextForScope <IterationIn <T> >( externalContext.Scope + "." + name, null); } }
public CentralizedProgressTracker(InternalGraphManager graphManager) { var centralizerProcessId = graphManager.Controller.Configuration.CentralizerProcessId; var centralizerThreadId = graphManager.Controller.Configuration.CentralizerThreadId; var processes = graphManager.Controller.Configuration.Processes; var processid = graphManager.Controller.Configuration.ProcessID; Logging.Progress("Centralized progress tracker enabled, running on process {0} thread {1}", centralizerProcessId, centralizerThreadId); var context = new OpaqueTimeContext <Pointstamp>(graphManager.ContextManager.MakeRawContextForScope <Pointstamp>("progress context")); // construct aggregator stage and unconnected output var aggregatorPlacement = new SingleVertexPerProcessPlacement(processes, 0); var aggregatorStage = new Stage <ProgressUpdateAggregator, Pointstamp>(aggregatorPlacement, context, Stage.OperatorType.Default, (i, v) => new ProgressUpdateAggregator(i, v), "Aggregator"); var stream = aggregatorStage.NewOutput(shard => shard.Output); aggregatorStage.Materialize(); this.aggregator = aggregatorStage.GetShard(processid); // construct centralizer stage and unconnected input and output var centralizerPlacement = new SingleVertexPlacement(centralizerProcessId, centralizerThreadId); var centralizer = new Stage <ProgressUpdateCentralizer, Pointstamp>(centralizerPlacement, context, Stage.OperatorType.Default, (i, v) => new ProgressUpdateCentralizer(i, v, null), "Centralizer"); var centralizerRecvPort = centralizer.NewUnconnectedInput <Int64>(shard => shard.Input, null); var centralizerSendPort = centralizer.NewOutput(shard => shard.Output, null); centralizer.Materialize(); this.centralizer = (processid == centralizerProcessId) ? centralizer.GetShard(0) : null; // construct consumer stage and unconnected input var consumerPlacement = new SingleVertexPerProcessPlacement(processes, 0); var consumer = new Stage <ProgressUpdateConsumer, Pointstamp>(consumerPlacement, context, Stage.OperatorType.Default, (i, v) => new Runtime.Progress.ProgressUpdateConsumer(i, v, this.aggregator), "Consumer"); var consumerRecvPort = consumer.NewUnconnectedInput(shard => shard.Input, null); consumer.Materialize(); this.consumer = consumer.GetShard(processid); // connect centralizer to consumers with special progress channel var progressChannel = new ProgressChannel(centralizer.Placement.Count, this.consumer, centralizerSendPort.StageOutput, consumerRecvPort, graphManager.Controller, graphManager.AllocateNewGraphIdentifier()); centralizerSendPort.StageOutput.AttachBundleToSender(progressChannel); // connect aggregators to centralizer with special centralized progress channel var centralizerChannel = new CentralizedProgressChannel(centralizer, stream.StageOutput, centralizerRecvPort, graphManager.Controller, graphManager.AllocateNewGraphIdentifier()); stream.StageOutput.AttachBundleToSender(centralizerChannel); Logging.Progress("Centralized progress tracker initialization completed"); }
/// <summary> /// Creates a stage from a shard factory /// </summary> /// <typeparam name="TVertex">Shard type</typeparam> /// <typeparam name="TTime">Time type</typeparam> /// <param name="context">Time context</param> /// <param name="factory">Shard factory</param> /// <param name="name">Descriptive name</param> /// <returns>Constructed stage</returns> public static Stage <TVertex, TTime> NewStage <TVertex, TTime>(OpaqueTimeContext <TTime> context, Func <int, Stage <TTime>, TVertex> factory, string name) where TTime : Time <TTime> where TVertex : Vertex <TTime> { return(new Stage <TVertex, TTime>(context, factory, name)); }