summaryrefslogtreecommitdiff
path: root/src/vm/hillclimbing.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/hillclimbing.h')
-rw-r--r--src/vm/hillclimbing.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/vm/hillclimbing.h b/src/vm/hillclimbing.h
new file mode 100644
index 0000000000..9c85877ea4
--- /dev/null
+++ b/src/vm/hillclimbing.h
@@ -0,0 +1,97 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//=========================================================================
+
+//
+// HillClimbing.h
+//
+// Defines classes for the ThreadPool's HillClimbing concurrency-optimization
+// algorithm.
+//
+
+//=========================================================================
+
+#ifndef _HILLCLIMBING_H
+#define _HILLCLIMBING_H
+
+#include "complex.h"
+#include "random.h"
+
+enum HillClimbingStateTransition
+{
+ Warmup,
+ Initializing,
+ RandomMove,
+ ClimbingMove,
+ ChangePoint,
+ Stabilizing,
+ Starvation, //used by ThreadpoolMgr
+ ThreadTimedOut, //used by ThreadpoolMgr
+ Undefined,
+};
+
+
+class HillClimbing
+{
+private:
+ int m_wavePeriod;
+ int m_samplesToMeasure;
+ double m_targetThroughputRatio;
+ double m_targetSignalToNoiseRatio;
+ double m_maxChangePerSecond;
+ double m_maxChangePerSample;
+ int m_maxThreadWaveMagnitude;
+ DWORD m_sampleIntervalLow;
+ double m_threadMagnitudeMultiplier;
+ DWORD m_sampleIntervalHigh;
+ double m_throughputErrorSmoothingFactor;
+ double m_gainExponent;
+ double m_maxSampleError;
+
+ double m_currentControlSetting;
+ LONGLONG m_totalSamples;
+ int m_lastThreadCount;
+ double m_elapsedSinceLastChange; //elapsed seconds since last thread count change
+ double m_completionsSinceLastChange; //number of completions since last thread count change
+
+ double m_averageThroughputNoise;
+
+ double* m_samples; //Circular buffer of the last m_samplesToMeasure samples
+ double* m_threadCounts; //Thread counts effective at each of m_samples
+
+ unsigned int m_currentSampleInterval;
+ CLRRandom m_randomIntervalGenerator;
+
+ int m_accumulatedCompletionCount;
+ double m_accumulatedSampleDuration;
+
+ void ChangeThreadCount(int newThreadCount, HillClimbingStateTransition transition);
+ void LogTransition(int threadCount, double throughput, HillClimbingStateTransition transition);
+
+ Complex GetWaveComponent(double* samples, int sampleCount, double period);
+
+public:
+ void Initialize();
+ int Update(int currentThreadCount, double sampleDuration, int numCompletions, int* pNewSampleInterval);
+ void ForceChange(int newThreadCount, HillClimbingStateTransition transition);
+};
+
+#define HillClimbingLogCapacity 200
+
+struct HillClimbingLogEntry
+{
+ DWORD TickCount;
+ HillClimbingStateTransition Transition;
+ int NewControlSetting;
+ int LastHistoryCount;
+ float LastHistoryMean;
+};
+
+GARY_DECL(HillClimbingLogEntry, HillClimbingLog, HillClimbingLogCapacity);
+GVAL_DECL(int, HillClimbingLogFirstIndex);
+GVAL_DECL(int, HillClimbingLogSize);
+typedef DPTR(HillClimbingLogEntry) PTR_HillClimbingLogEntry;
+
+#endif