/// <summary> /// Creates instance /// </summary> public PipQueue(LoggingContext loggingContext, IConfiguration config) { Contract.Requires(config != null); m_scheduleConfig = config.Schedule; // If adaptive IO is enabled, then start with the half of the maxIO. var ioLimit = m_scheduleConfig.AdaptiveIO ? (m_scheduleConfig.MaxIO + 1) / 2 : m_scheduleConfig.MaxIO; m_chooseWorkerLightQueue = new ChooseWorkerQueue(this, 1); m_chooseWorkerCacheLookupQueue = new ChooseWorkerQueue(this, m_scheduleConfig.MaxChooseWorkerCacheLookup); m_chooseWorkerCpuQueue = m_scheduleConfig.ModuleAffinityEnabled() ? new NestedChooseWorkerQueue(this, m_scheduleConfig.MaxChooseWorkerCpu, config.Distribution.BuildWorkers.Count + 1) : new ChooseWorkerQueue(this, m_scheduleConfig.MaxChooseWorkerCpu); m_queuesByKind = new Dictionary <DispatcherKind, DispatcherQueue>() { { DispatcherKind.IO, new DispatcherQueue(this, ioLimit) }, { DispatcherKind.DelayedCacheLookup, new DispatcherQueue(this, maxParallelDegree: 1) }, { DispatcherKind.ChooseWorkerCacheLookup, m_chooseWorkerCacheLookupQueue }, { DispatcherKind.ChooseWorkerLight, m_chooseWorkerLightQueue }, { DispatcherKind.CacheLookup, new DispatcherQueue(this, m_scheduleConfig.MaxCacheLookup) }, { DispatcherKind.ChooseWorkerCpu, m_chooseWorkerCpuQueue }, { DispatcherKind.CPU, new DispatcherQueue(this, m_scheduleConfig.EffectiveMaxProcesses, useWeight: true) }, { DispatcherKind.Materialize, new DispatcherQueue(this, m_scheduleConfig.MaxMaterialize) }, { DispatcherKind.Light, new DispatcherQueue(this, m_scheduleConfig.MaxLightProcesses) }, { DispatcherKind.SealDirs, new DispatcherQueue(this, m_scheduleConfig.MaxSealDirs) }, }; m_hasAnyChange = new ManualResetEventSlim(initialState: true /* signaled */); Tracing.Logger.Log.PipQueueConcurrency( loggingContext, ioLimit, m_scheduleConfig.MaxChooseWorkerCacheLookup, m_scheduleConfig.MaxCacheLookup, m_scheduleConfig.MaxChooseWorkerCpu, m_scheduleConfig.EffectiveMaxProcesses, m_scheduleConfig.MaxMaterialize, m_scheduleConfig.MaxLightProcesses, m_scheduleConfig.OrchestratorCacheLookupMultiplier.ToString(), m_scheduleConfig.OrchestratorCpuMultiplier.ToString()); }
/// <summary> /// Creates instance /// </summary> public PipQueue(IScheduleConfiguration config) { Contract.Requires(config != null); m_config = config; // If adaptive IO is enabled, then start with the half of the maxIO. var ioLimit = config.AdaptiveIO ? (config.MaxIO + 1) / 2 : config.MaxIO; m_chooseWorkerCacheLookupQueue = new ChooseWorkerQueue(this, config.MaxChooseWorkerCacheLookup); m_chooseWorkerCpuQueue = new ChooseWorkerQueue(this, config.MaxChooseWorkerCpu); m_queuesByKind = new Dictionary<DispatcherKind, DispatcherQueue>() { {DispatcherKind.IO, new DispatcherQueue(this, ioLimit)}, {DispatcherKind.ChooseWorkerCacheLookup, m_chooseWorkerCacheLookupQueue}, {DispatcherKind.CacheLookup, new DispatcherQueue(this, config.MaxCacheLookup)}, {DispatcherKind.ChooseWorkerCpu, m_chooseWorkerCpuQueue}, {DispatcherKind.CPU, new DispatcherQueue(this, config.MaxProcesses)}, {DispatcherKind.Materialize, new DispatcherQueue(this, config.MaxMaterialize)}, {DispatcherKind.Light, new DispatcherQueue(this, config.MaxLightProcesses)} }; m_hasAnyChange = new ManualResetEventSlim(initialState: true /* signaled */); Tracing.Logger.Log.PipQueueConcurrency( Events.StaticContext, ioLimit, config.MaxChooseWorkerCacheLookup, config.MaxCacheLookup, config.MaxChooseWorkerCpu, config.MaxProcesses, config.MaxMaterialize, config.MaxLightProcesses, config.MasterCacheLookupMultiplier.ToString(), config.MasterCpuMultiplier.ToString()); }