9 int numberOfTasksToHoldBack_,
11 bool fuseTasksImmediatelyWhenSpawned_,
12 bool processPendingTasksWhileWaiting_
14 numberOfTasksToHoldBack(numberOfTasksToHoldBack_),
15 fusionInstruction(fusionInstruction_),
16 fuseTasksImmediatelyWhenSpawned(fuseTasksImmediatelyWhenSpawned_),
17 processPendingTasksWhileWaiting(processPendingTasksWhileWaiting_) {}
54 const int MaxInitialRage = 16;
55 for (
int numberOfTasksToHoldBack = 0; numberOfTasksToHoldBack <= MaxInitialRage; numberOfTasksToHoldBack++)
56 for (
int maxTasksToFuse = 0; maxTasksToFuse <= MaxInitialRage; maxTasksToFuse++)
57 for (
int minTasksToFuse = 0; minTasksToFuse <= maxTasksToFuse; minTasksToFuse++)
60 for (
int fuseTasksImmediatelyWhenSpawned = 0; fuseTasksImmediatelyWhenSpawned < 2;
61 fuseTasksImmediatelyWhenSpawned++)
62 for (
int processPendingTasksWhileWaiting = 0; processPendingTasksWhileWaiting < 2;
63 processPendingTasksWhileWaiting++) {
64 _configurationVariants.insert(std::pair<Key, Value>(
66 numberOfTasksToHoldBack,
68 fuseTasksImmediatelyWhenSpawned == 0,
69 processPendingTasksWhileWaiting == 0
99 if (nestedParallelismLevel <= 1) {
100 const int BSPRunThroughsWithActiveKey = 16;
101 _bspRunThroughsWithActiveKey++;
103 if (_bspRunThroughsWithActiveKey >= BSPRunThroughsWithActiveKey) {
104 _bspRunThroughsWithActiveKey = 0;
106 _currentWatch.stop();
107 double newValue = _currentWatch.getCalendarTime();
109 constexpr double Min = 1e-8;
110 if (newValue > Min) {
112 _configurationVariants.at(_activeKey).measurement.setValue(newValue);
115 if (_lastDuration > Min and _lastDuration > _configurationVariants.at(_activeKey).measurement.getValue()) {
116 increaseProbabilityOfActiveConfiguration();
117 removeUnreasonableProbabilities();
120 _lastDuration = _configurationVariants.at(_activeKey).measurement.getValue();
122 pickNewActiveConfigurationRandomly();
130 _activeKey.numberOfTasksToHoldBack - 1,
131 _activeKey.fusionInstruction,
132 _activeKey.fuseTasksImmediatelyWhenSpawned,
133 _activeKey.processPendingTasksWhileWaiting
136 _activeKey.numberOfTasksToHoldBack - 1,
137 _activeKey.fusionInstruction,
138 _activeKey.fuseTasksImmediatelyWhenSpawned,
139 _activeKey.processPendingTasksWhileWaiting
142 _activeKey.numberOfTasksToHoldBack,
144 _activeKey.fusionInstruction.device,
145 _activeKey.fusionInstruction.minTasks,
146 _activeKey.fusionInstruction.maxTasks + 1
148 _activeKey.fuseTasksImmediatelyWhenSpawned,
149 _activeKey.processPendingTasksWhileWaiting
152 _activeKey.numberOfTasksToHoldBack,
154 _activeKey.fusionInstruction.device,
155 _activeKey.fusionInstruction.minTasks + 1,
156 _activeKey.fusionInstruction.maxTasks + 1
158 _activeKey.fuseTasksImmediatelyWhenSpawned,
159 _activeKey.processPendingTasksWhileWaiting
161 if (_configurationVariants.count(left) == 0) {
162 _configurationVariants.insert(std::pair<Key, Value>(left,
Value(_configurationVariants.at(_activeKey).probability))
164 logInfo(
"increaseProbabilityOfActiveConfiguration()",
"insert new potential configuration " << left.toString());
166 if (_configurationVariants.count(right) == 0) {
167 _configurationVariants.insert(std::pair<Key, Value>(right,
Value(_configurationVariants.at(_activeKey).probability))
169 logInfo(
"increaseProbabilityOfActiveConfiguration()",
"insert new potential configuration " << right.toString());
171 if (_configurationVariants.count(down) == 0) {
172 _configurationVariants.insert(std::pair<Key, Value>(down,
Value(_configurationVariants.at(_activeKey).probability))
174 logInfo(
"increaseProbabilityOfActiveConfiguration()",
"insert new potential configuration " << down.
toString());
176 if (_configurationVariants.count(up) == 0) {
177 _configurationVariants.insert(std::pair<Key, Value>(up,
Value(_configurationVariants.at(_activeKey).probability)));
178 logInfo(
"increaseProbabilityOfActiveConfiguration()",
"insert new potential configuration " << up.
toString());
181 _configurationVariants.at(_activeKey).probability *= 1.1;
185 constexpr double MinValue = 1e-8;
187 double MinProbability = 0.1 / _configurationVariants.size();
189 std::map<Key, Value>::iterator p = _configurationVariants.begin();
190 while (p != _configurationVariants.end()) {
191 if (p->second.measurement.getValue() > MinProbability and p->second.probability <= MinProbability) {
193 "removeUnreasonableProbabilities()",
194 "remove option " << p->first.toString() <<
" as it has low probability (" << p->second.probability <<
")"
196 p = _configurationVariants.erase(p);
204 double targetIntegrand =
static_cast<double>(std::rand()) /
static_cast<double>(RAND_MAX);
205 double currentIntegrand = 0.0;
207 std::map<Key, Value>::iterator p = _configurationVariants.begin();
208 currentIntegrand += p->second.probability;
209 while (currentIntegrand < targetIntegrand) {
210 currentIntegrand += p->second.probability;
213 if (p == _configurationVariants.end()) {
214 p = _configurationVariants.begin();
217 _activeKey = p->first;
218 logInfo(
"pickNewActiveConfigurationRandomly()",
"picked key " << _activeKey.toString());