OpenASIP 2.2
Loading...
Searching...
No Matches
Private Member Functions | Private Attributes | Static Private Attributes | List of all members
MinimizeMachine Class Reference
Inheritance diagram for MinimizeMachine:
Inheritance graph
Collaboration diagram for MinimizeMachine:
Collaboration graph

Private Member Functions

 PLUGIN_DESCRIPTION ("Removes resources until the real time " "requirements of applications are not reached anymore.")
 
 MinimizeMachine ()
 
virtual bool requiresStartingPointArchitecture () const
 
virtual bool producesArchitecture () const
 
virtual bool requiresHDB () const
 
virtual bool requiresSimulationData () const
 
virtual std::vector< RowIDexplore (const RowID &configurationID, const unsigned int &)
 
void readParameters ()
 
RowID minimizeMachine (RowID confToMinimize)
 
RowID minimizeBuses (RowID confToMinimize, std::vector< ClockCycleCount > &maxCycleCounts)
 
RowID minimizeRegisterFiles (RowID confToMinimize, std::vector< ClockCycleCount > &maxCycleCounts)
 
RowID minimizeFunctionUnits (RowID confToMinimize, std::vector< ClockCycleCount > &maxCycleCounts)
 
bool evalNewConfigWithoutImplementation (DesignSpaceExplorer &explorer, const TTAMachine::Machine &mach, DSDBManager &dsdb, DSDBManager::MachineConfiguration &newConfiguration, RowID &confID, CostEstimates &newEstimates)
 
bool checkCycleCounts (const DSDBManager::MachineConfiguration &conf, const std::vector< ClockCycleCount > &maxCycleCounts)
 

Private Attributes

bool minBus_
 minimize busses
 
bool minFU_
 minimize function units
 
bool minRF_
 minimize register files
 
unsigned int frequency_
 running frequency in MHz for apps
 

Static Private Attributes

static const std::string minBusPN_
 
static const std::string minFUPN_
 
static const std::string minRFPN_
 
static const std::string frequencyPN_
 

Additional Inherited Members

- Public Types inherited from DesignSpaceExplorerPlugin
typedef std::pair< std::string, ExplorerPluginParameterParameter
 
typedef std::map< std::string, ExplorerPluginParameterParameterMap
 
typedef std::map< std::string, ExplorerPluginParameter >::iterator PMIt
 
typedef std::map< std::string, ExplorerPluginParameter >::const_iterator PMCIt
 
- Public Member Functions inherited from DesignSpaceExplorerPlugin
virtual bool requiresApplication () const
 
virtual std::string description () const
 
void addParameter (TCEString name, ExplorerPluginParameterType type, bool compulsory=true, TCEString defaultValue="", TCEString description="")
 
template<typename T >
void readCompulsoryParameter (const std::string paramName, T &param) const
 
template<typename T >
void readOptionalParameter (const std::string paramName, T &param) const
 
template<typename RT >
RT parameterValue (const std::string &paramName) const
 
virtual ~DesignSpaceExplorerPlugin ()
 
virtual void giveParameter (const std::string &name, const std::string &value)
 
virtual std::string name () const
 
virtual void setPluginName (const std::string &pluginName)
 
virtual bool hasParameter (const std::string &paramName) const
 
ParameterMap parameters () const
 
virtual bool booleanValue (const std::string &parameter) const
 
- Public Member Functions inherited from DesignSpaceExplorer
 DesignSpaceExplorer ()
 
virtual ~DesignSpaceExplorer ()
 
virtual void setDSDB (DSDBManager &dsdb)
 
virtual bool evaluate (const DSDBManager::MachineConfiguration &configuration, CostEstimates &results=dummyEstimate_, bool estimate=false)
 
virtual DSDBManagerdb ()
 
std::vector< DesignSpaceExplorerPlugin * > getPlugins ()
 
RowID createImplementationAndStore (const DSDBManager::MachineConfiguration &conf, const double &frequency=0.0, const double &maxArea=0.0, const bool &createEstimates=true, const std::string &icDec="DefaultICDecoder", const std::string &icDecHDB="asic_130nm_1.5V.hdb")
 
bool createImplementation (const DSDBManager::MachineConfiguration &conf, DSDBManager::MachineConfiguration &newConf, const double &frequency=0.0, const double &maxArea=0.0, const bool &createEstimates=true, const std::string &icDec="DefaultICDecoder", const std::string &icDecHDB="asic_130nm_1.5V.hdb")
 
IDF::MachineImplementationselectComponents (const TTAMachine::Machine &mach, const double &frequency=0.0, const double &maxArea=0.0, const std::string &icDec="DefaultICDecoder", const std::string &icDecHDB="asic_130nm_1.5V.hdb") const
 
void createEstimateData (const TTAMachine::Machine &mach, const IDF::MachineImplementation &idf, CostEstimator::AreaInGates &area, CostEstimator::DelayInNanoSeconds &longestPathDelay)
 
RowID addConfToDSDB (const DSDBManager::MachineConfiguration &conf)
 
- Static Public Member Functions inherited from DesignSpaceExplorer
static DesignSpaceExplorerPluginloadExplorerPlugin (const std::string &pluginName, DSDBManager *dsdb=NULL)
 
- Protected Member Functions inherited from DesignSpaceExplorerPlugin
 DesignSpaceExplorerPlugin ()
 
void checkParameters () const
 
- Protected Member Functions inherited from DesignSpaceExplorer
TTAProgram::Programschedule (const std::string applicationFile, TTAMachine::Machine &machine, TCEString paramOptions="-O3")
 
const ExecutionTracesimulate (const TTAProgram::Program &program, const TTAMachine::Machine &machine, const TestApplication &testApplication, const ClockCycleCount &maxCycles, ClockCycleCount &runnedCycles, const bool tracing, const bool useCompiledSimulation=false, std::vector< ClockCycleCount > *executionCounts=NULL)
 
- Protected Attributes inherited from DesignSpaceExplorerPlugin
std::string pluginName_
 the name of the explorer plugin
 
ParameterMap parameters_
 Parameters for the plugin.
 

Detailed Description

Explorer plugin that removes resources until the real time requirements of applications are not reached anymore.

@TODO: maxRunTime parameter, which overrides app dir max runtime setting @TODO: if no maxRunTime then no frequency is needed == no cycle count limits

Supported parameters:

Definition at line 70 of file MinimizeMachine.cc.

Constructor & Destructor Documentation

◆ MinimizeMachine()

MinimizeMachine::MinimizeMachine ( )
inlineprivate

Definition at line 74 of file MinimizeMachine.cc.

75 minBus_(true),
76 minFU_(true),
77 minRF_(true),
78 frequency_(0) {
79
80 // compulsory parameters
82
83 // parameters that have a default value
87 }
#define UINT(OPERAND)
Definition OSAL.hh:313
#define BOOL()
static std::string toString(const T &source)
void addParameter(TCEString name, ExplorerPluginParameterType type, bool compulsory=true, TCEString defaultValue="", TCEString description="")
unsigned int frequency_
running frequency in MHz for apps
static const std::string frequencyPN_
static const std::string minBusPN_
static const std::string minRFPN_
bool minRF_
minimize register files
bool minBus_
minimize busses
static const std::string minFUPN_
bool minFU_
minimize function units

References DesignSpaceExplorerPlugin::addParameter(), BOOL, frequencyPN_, minBus_, minBusPN_, minFU_, minFUPN_, minRF_, minRFPN_, Conversion::toString(), and UINT.

Here is the call graph for this function:

Member Function Documentation

◆ checkCycleCounts()

bool MinimizeMachine::checkCycleCounts ( const DSDBManager::MachineConfiguration conf,
const std::vector< ClockCycleCount > &  maxCycleCounts 
)
inlineprivate

Checks that max cycle counts are not exceeded.

Expects that maxCycleCount vector contains cycle counts for the matching programs in the same order as the estimates.

Parameters
estimatesEstimations that contain cycle counts.
maxCycleCountsMaximum cycle counts of the applications.
Returns
true if maximum cycle counts are not exceeded, false otherwise.

Definition at line 701 of file MinimizeMachine.cc.

703 {
704
705
706 std::vector<ClockCycleCount> cycleCounts;
707 std::set<RowID> appIds = db().applicationIDs();
708 for (std::set<RowID>::const_iterator appI = appIds.begin();
709 appI != appIds.end(); ++appI) {
710 RowID appID = *appI;
711 if (!db().hasCycleCount(appID, conf.architectureID)) {
712 abortWithError("there was no cycle count?");
713 }
714 cycleCounts.push_back(
715 db().cycleCount(appID, conf.architectureID));
716 }
717
718 for (int i = 0; i < (int)cycleCounts.size(); i++) {
719 // if no time constraints
720 if (maxCycleCounts.at(i) < 1) {
721 continue;
722 }
723 // if some apps maxCycles was exceeded
724 if (maxCycleCounts.at(i) < cycleCounts.at(i)) {
725 return false;
726 }
727 }
728 return true;
729 }
#define abortWithError(message)
int RowID
Type definition of row ID in relational databases.
Definition DBTypes.hh:37
std::set< RowID > applicationIDs() const
bool hasCycleCount(RowID application, RowID architecture) const
virtual DSDBManager & db()

References abortWithError, DSDBManager::applicationIDs(), DSDBManager::MachineConfiguration::architectureID, DesignSpaceExplorer::db(), and DSDBManager::hasCycleCount().

Referenced by minimizeBuses(), minimizeFunctionUnits(), and minimizeRegisterFiles().

Here is the call graph for this function:

◆ evalNewConfigWithoutImplementation()

bool MinimizeMachine::evalNewConfigWithoutImplementation ( DesignSpaceExplorer explorer,
const TTAMachine::Machine mach,
DSDBManager dsdb,
DSDBManager::MachineConfiguration newConfiguration,
RowID confID,
CostEstimates newEstimates 
)
inlineprivate

Create, store and evaluate a new configuration without implementation.

Parameters
explorerDesign space explorer to use to evaluate.
machmachine for the new configuration.
dsdbDesign space database to store the new configuration.
newConfigurationNew machine configuration.
confIDRow ID of the new configuration in the DSDB.
newEstimatesEstimates that are calculated during evaluation.
Returns
true if evaluation succeed, if not, return false.

Definition at line 669 of file MinimizeMachine.cc.

672 {
673 try {
674 newConfiguration.architectureID = dsdb.addArchitecture(mach);
675 } catch (const RelationalDBException& e) {
676 // Error occurred while adding adf to the dsdb, adf
677 // probably too big
678 throw e;
679 }
680 newConfiguration.hasImplementation = false;
681
682 try {
683 confID = dsdb.addConfiguration(newConfiguration);
684 } catch (const KeyNotFound& e) {
685 throw e;
686 }
687
688 return explorer.evaluate(newConfiguration, newEstimates, false);
689 }
RowID addArchitecture(const TTAMachine::Machine &mom)
RowID addConfiguration(const MachineConfiguration &conf)
virtual bool evaluate(const DSDBManager::MachineConfiguration &configuration, CostEstimates &results=dummyEstimate_, bool estimate=false)

References DSDBManager::addArchitecture(), DSDBManager::addConfiguration(), DSDBManager::MachineConfiguration::architectureID, DesignSpaceExplorer::evaluate(), and DSDBManager::MachineConfiguration::hasImplementation.

Referenced by minimizeFunctionUnits(), and minimizeRegisterFiles().

Here is the call graph for this function:

◆ explore()

virtual std::vector< RowID > MinimizeMachine::explore ( const RowID configurationID,
const unsigned int &   
)
inlineprivatevirtual

Minimizes given configuration by not exceeding applications max runtime which depends on given frequncy

Reimplemented from DesignSpaceExplorerPlugin.

Definition at line 99 of file MinimizeMachine.cc.

99 {
100 std::vector<RowID> result;
101
103
104 // TODO: make better parameter error function
105 if (frequency_ < 1) {
106 result.push_back(configurationID);
107 return result;
108 }
109
110 RowID min = minimizeMachine(configurationID);
111
112 result.push_back(min);
113 return result;
114 }
RowID minimizeMachine(RowID confToMinimize)

References frequency_, minimizeMachine(), and readParameters().

Here is the call graph for this function:

◆ minimizeBuses()

RowID MinimizeMachine::minimizeBuses ( RowID  confToMinimize,
std::vector< ClockCycleCount > &  maxCycleCounts 
)
inlineprivate

Reduces the number of buses in the machine as much as possible to still achieve the application run time requirements.

This function can handle implementations. Uses binary search to minimize the buses.

Parameters
confToMinimizeID of the machine configuration which buses are reduced.
maxCycleCountsMax cycle counts per program.
Returns
ID of the new congiguration where buses are reduced.

Definition at line 228 of file MinimizeMachine.cc.

230 {
231
232 DSDBManager& dsdb = db();
233
235 dsdb.configuration(confToMinimize);
236
237 TTAMachine::Machine* mach = NULL;
238 try {
239 mach = dsdb.architecture(configuration.architectureID);
240 } catch (const Exception& e) {
241 debugLog(std::string("No machine architecture found in config id "
242 "by MimimizeMachine plugin. "));
243 delete mach;
244 return confToMinimize;
245 }
246
248
249 // can't reduce buses from one
250 int origBusCount = busNav.count();
251 if (origBusCount < 2) {
252 return confToMinimize;
253 }
254
255 DesignSpaceExplorer explorer;
256 explorer.setDSDB(dsdb);
257
258 CostEstimates estimates;
259
260 // new configuration must be created
262 startConf.architectureID = dsdb.addArchitecture(*mach);
263 startConf.hasImplementation = false;
264
265 if (!explorer.evaluate(startConf, estimates, false)) {
266 delete mach;
267 mach = NULL;
268 // return the original conf
269 return confToMinimize;
270 }
271
272 // check if some apps maxCycles was exceeded
273 if (!checkCycleCounts(startConf, maxCycleCounts)) {
274 delete mach;
275 mach = NULL;
276 // return the original conf
277 return confToMinimize;
278 }
279
281
282 // variables for binary search
283 int busHigh = origBusCount;
284 int busLow = 1;
285 int busMid = (busLow + busHigh) /2;
286
287 TTAMachine::Machine* newMach = NULL;
288 RowID lastArchID = 0;
289 RowID lastConfID = 0;
290 RowID lastOKArchID = 0;
291 RowID lastOKConfID = 0;
292
293 std::list<std::string> removedBusNames;
294
295 // use binary search to find out the bus count that can be removed
296 // removes busses as long as each apps max cycle counts are not exceeded
297 // if buses are not of equal value this doesn't really work.
298 do {
299 assert(newMach == NULL);
300 newMach = new TTAMachine::Machine(*mach);
301
302 int busesToRemove = (origBusCount - busMid);
303
304 if (!modifier.removeBuses(busesToRemove, *newMach, removedBusNames)) {
305 // TODO: some good way to cope with non complete bus removal
306 }
307
308 DSDBManager::MachineConfiguration newConfiguration;
309 try {
310 lastArchID = dsdb.addArchitecture(*newMach);
311 // machine stored to dsdb can be deleted
312 delete newMach;
313 newMach = NULL;
314 } catch (const RelationalDBException& e) {
315 // Error occurred while adding adf to the dsdb, adf
316 // probably too big
317 delete newMach;
318 newMach = NULL;
319 break;
320 }
321
322 newConfiguration.architectureID = lastArchID;
323 newConfiguration.hasImplementation = false;
324 try {
325 lastConfID = dsdb.addConfiguration(newConfiguration);
326 } catch (const KeyNotFound& e) {
327 break;
328 }
329 CostEstimates newEstimates;
330
331 bool newConfigOK = false;
332 if (explorer.evaluate(newConfiguration, newEstimates, false)) {
333 // goes through every apps new cycles
334 newConfigOK =
335 checkCycleCounts(newConfiguration, maxCycleCounts);
336 }
337
338 if (newConfigOK) {
339 busHigh = busMid - 1;
340 busMid = (busLow + busMid) / 2;
341 lastOKArchID = lastArchID;
342 lastOKConfID = lastConfID;
343 } else {
344 busLow = busMid + 1;
345 busMid = (busMid + busHigh) / 2;
346 }
347 } while (busLow <= busHigh && busLow <= busMid);
348
349 // these aren't needed anymore
350 lastArchID = 0;
351 lastConfID = 0;
352
353 // delete old machine
354 delete mach;
355 mach = NULL;
356
357 // check if no new architecture/config could be created
358 if (lastOKArchID == 0) {
359 return confToMinimize;
360 }
361
362 // create new idf for the new machine if needed
363 if (configuration.hasImplementation) {
365 dsdb.implementation(configuration.implementationID);
366
367 // remove removed busses from orginal implementation file
368 std::list<std::string>::const_iterator busNameIter =
369 removedBusNames.begin();
370 while (busNameIter != removedBusNames.end()) {
371 idf->removeBusImplementation(*busNameIter);
372 busNameIter++;
373 }
374
375 DSDBManager::MachineConfiguration newConfiguration;
376 newConfiguration.architectureID = lastOKArchID;
377
378 CostEstimates newEstimates;
379 if (explorer.evaluate(newConfiguration, newEstimates, false)) {
380 newConfiguration.implementationID =
382 *idf, newEstimates.longestPathDelay(),newEstimates.area());
383
384 delete idf;
385 idf = NULL;
386
387 newConfiguration.hasImplementation = true;
388 // add new configuration
389 RowID confID = dsdb.addConfiguration(newConfiguration);
390 return confID;
391 } else {
392 return confToMinimize;
393 }
394 } else {
395 return lastOKConfID;
396 }
397
398 assert(false);
399 return 9999;
400 }
#define debugLog(text)
#define assert(condition)
double area() const
double longestPathDelay() const
TTAMachine::Machine * architecture(RowID id) const
IDF::MachineImplementation * implementation(RowID id) const
MachineConfiguration configuration(RowID id) const
RowID addImplementation(const IDF::MachineImplementation &impl, double longestPathDelay, CostEstimator::AreaInGates area)
virtual void setDSDB(DSDBManager &dsdb)
void removeBusImplementation(const std::string &unitName)
bool removeBuses(const int &countToRemove, TTAMachine::Machine &mach, std::list< std::string > &removedBusNames)
bool checkCycleCounts(const DSDBManager::MachineConfiguration &conf, const std::vector< ClockCycleCount > &maxCycleCounts)
virtual BusNavigator busNavigator() const
Definition Machine.cc:356

References DSDBManager::addArchitecture(), DSDBManager::addConfiguration(), DSDBManager::addImplementation(), DSDBManager::architecture(), DSDBManager::MachineConfiguration::architectureID, CostEstimates::area(), assert, TTAMachine::Machine::busNavigator(), checkCycleCounts(), DSDBManager::configuration(), TTAMachine::Machine::Navigator< ComponentType >::count(), DesignSpaceExplorer::db(), debugLog, DesignSpaceExplorer::evaluate(), DSDBManager::MachineConfiguration::hasImplementation, DSDBManager::implementation(), DSDBManager::MachineConfiguration::implementationID, CostEstimates::longestPathDelay(), MachineResourceModifier::removeBuses(), IDF::MachineImplementation::removeBusImplementation(), and DesignSpaceExplorer::setDSDB().

Referenced by minimizeMachine().

Here is the call graph for this function:

◆ minimizeFunctionUnits()

RowID MinimizeMachine::minimizeFunctionUnits ( RowID  confToMinimize,
std::vector< ClockCycleCount > &  maxCycleCounts 
)
inlineprivate

Reduces the number of function units in the machine as much as possible to still achieve the application run time requirements.

This function won't handle implementations.

Parameters
confToMinimizeID of the machine configuration which function units are reduced.
maxCycleCountsMax cycle counts per program.
Returns
ID of the new congiguration where function units are reduced or same that was given if nothing was done.

Definition at line 544 of file MinimizeMachine.cc.

546 {
547
548 DSDBManager& dsdb = db();
549 RowID latestConfID = 0;
550
552 DesignSpaceExplorer explorer;
553 explorer.setDSDB(dsdb);
554
556 dsdb.configuration(confToMinimize);
557
558 const TTAMachine::Machine* origMach = NULL;
559 try {
560 origMach = dsdb.architecture(configuration.architectureID);
561 } catch (const Exception& e) {
562 debugLog(std::string("No machine architecture found in config id "
563 "by MimimizeMachine plugin. "));
564 delete origMach;
565 return confToMinimize;
566 }
567
569 modifier.analyzeFunctionUnits(*origMach, origFUMap);
570
571 CostEstimates estimates;
573 startConf.architectureID = dsdb.addArchitecture(*origMach);
574 startConf.hasImplementation = false;
575
576 if (!explorer.evaluate(startConf, estimates, false)) {
577 // can't evaluate the given configuration
578 delete origMach;
579 origMach = NULL;
580 return confToMinimize;
581 }
582
583 // check if some apps maxCycles was exceeded
584 if (!checkCycleCounts(startConf, maxCycleCounts)) {
585 delete origMach;
586 origMach = NULL;
587 return confToMinimize;
588 }
589
590 MachineResourceModifier::FunctionUnitMap::const_iterator fuMapIter =
591 origFUMap.begin();
592
593 ObjectState* currentState = origMach->saveState();
594
595 // go through all different function unit types
596 for (; fuMapIter != origFUMap.end(); fuMapIter++) {
598 mach.loadState(currentState);
601 int i = 0;
602 // go through every function unit in the machine to find matching FU
603 while (i < fuNav.count()) {
604 if (((*fuMapIter).second)->isArchitectureEqual(
605 fuNav.item(i), true)) {
606
607 mach.removeFunctionUnit(*fuNav.item(i));
608 std::list<std::string> socketList;
609 modifier.removeNotConnectedSockets(mach, socketList);
610
611 DSDBManager::MachineConfiguration newConfiguration;
612 RowID confID = 0;
613 CostEstimates newEstimates;
614
615 // if the evaluation fails the removed FU is needed
616 // and the old machine state is loaded
617 if (!evalNewConfigWithoutImplementation(explorer, mach,
618 dsdb, newConfiguration, confID, newEstimates)) {
619
620 // continue with old machine state and
621 // try with next FU type
622 break;
623 }
624
625 // goes through every apps new cycles
626 if (!checkCycleCounts(newConfiguration, maxCycleCounts)) {
627 // continue with old machine state and
628 // try with next register file type
629 break;
630 }
631 latestConfID = confID;
632
633 // save the new machine state
634 delete currentState;
635 currentState = mach.saveState();
636
637 // continue removing same FU type
638 // no need to advance the FU navigator,
639 // because of the removal
640 continue;
641 }
642 // if the units did not match, try next one in the machine
643 i++;
644 }
645 }
646 delete origMach;
647 origMach = NULL;
648 if (latestConfID != 0) {
649 return latestConfID;
650 } else {
651 // no new config could be created
652 return confToMinimize;
653 }
654 }
std::multimap< double, TTAMachine::FunctionUnit * > FunctionUnitMap
Map of function unit amounts in percents.
void analyzeFunctionUnits(const TTAMachine::Machine &mach, FunctionUnitMap &unitMap) const
void removeNotConnectedSockets(TTAMachine::Machine &mach, std::list< std::string > &removedSocketNames)
bool evalNewConfigWithoutImplementation(DesignSpaceExplorer &explorer, const TTAMachine::Machine &mach, DSDBManager &dsdb, DSDBManager::MachineConfiguration &newConfiguration, RowID &confID, CostEstimates &newEstimates)
ComponentType * item(int index) const
virtual FunctionUnitNavigator functionUnitNavigator() const
Definition Machine.cc:380
virtual void loadState(const ObjectState *state)
Definition Machine.cc:728
virtual ObjectState * saveState() const
Definition Machine.cc:686
virtual void removeFunctionUnit(FunctionUnit &unit)
Definition Machine.cc:530

References DSDBManager::addArchitecture(), MachineResourceModifier::analyzeFunctionUnits(), DSDBManager::architecture(), DSDBManager::MachineConfiguration::architectureID, checkCycleCounts(), DSDBManager::configuration(), TTAMachine::Machine::Navigator< ComponentType >::count(), DesignSpaceExplorer::db(), debugLog, evalNewConfigWithoutImplementation(), DesignSpaceExplorer::evaluate(), TTAMachine::Machine::functionUnitNavigator(), DSDBManager::MachineConfiguration::hasImplementation, TTAMachine::Machine::Navigator< ComponentType >::item(), TTAMachine::Machine::loadState(), TTAMachine::Machine::removeFunctionUnit(), MachineResourceModifier::removeNotConnectedSockets(), TTAMachine::Machine::saveState(), and DesignSpaceExplorer::setDSDB().

Referenced by minimizeMachine().

Here is the call graph for this function:

◆ minimizeMachine()

RowID MinimizeMachine::minimizeMachine ( RowID  confToMinimize)
inlineprivate

Minimizes the number of buses, function units and register files in the given configuration in that order.

This function minimizes the buses first, then function units and then register files. Removes also the extra sockets after minimization. Won't handle implementaions (IDF handling missing from fu and rf part).

Parameters
confToMinimizeConfiguration to be minimized.
maxCyclesMaximum clock cycle count that won't be exceeded.
Returns
Minimized configuration id.

Definition at line 157 of file MinimizeMachine.cc.

157 {
158
159 // calculate maxCycleCounts for all apps
160 DSDBManager& dsdb = db();
161 std::vector<ClockCycleCount> maxCycleCounts;
162 std::set<RowID> applicationIDs = dsdb.applicationIDs();
163 std::set<RowID>::const_iterator applicationIter;
164 for (applicationIter = applicationIDs.begin();
165 applicationIter != applicationIDs.end();
166 applicationIter++) {
167
168 TestApplication testApplication(
169 dsdb.applicationPath(*applicationIter));
170
171 if (testApplication.maxRuntime() <= 0) {
172 maxCycleCounts.push_back(0);
173 } else {
174 maxCycleCounts.push_back(
175 static_cast<ClockCycleCount>(
176 testApplication.maxRuntime() *
177 static_cast<double>(frequency_) *
178 static_cast<double>(1000000)));
179 }
180 }
181
182 RowID orgConfToMinimize = confToMinimize;
183 if (minBus_) {
184 confToMinimize = minimizeBuses(confToMinimize, maxCycleCounts);
185 CostEstimates res;
186 evaluate(dsdb.configuration(confToMinimize), res, true);
187 }
188
189 if (minFU_) {
190 confToMinimize = minimizeFunctionUnits(
191 confToMinimize,
192 maxCycleCounts);
193 CostEstimates res;
194 evaluate(dsdb.configuration(confToMinimize), res, true);
195 }
196
197 if (minRF_) {
198 confToMinimize = minimizeRegisterFiles(
199 confToMinimize,
200 maxCycleCounts);
201 CostEstimates res;
202 evaluate(dsdb.configuration(confToMinimize), res, true);
203 }
204
205 if (orgConfToMinimize == confToMinimize) {
206 debugLog(
207 std::string("No new config could be generated by "
208 "MinimizeMachine plugin."));
209 }
210 CostEstimates res;
211 evaluate(dsdb.configuration(confToMinimize), res, true);
212 return confToMinimize;
213 }
CycleCount ClockCycleCount
Alias for ClockCycleCount.
std::string applicationPath(RowID id) const
RowID minimizeBuses(RowID confToMinimize, std::vector< ClockCycleCount > &maxCycleCounts)
RowID minimizeRegisterFiles(RowID confToMinimize, std::vector< ClockCycleCount > &maxCycleCounts)
RowID minimizeFunctionUnits(RowID confToMinimize, std::vector< ClockCycleCount > &maxCycleCounts)

References DSDBManager::applicationIDs(), DSDBManager::applicationPath(), DSDBManager::configuration(), DesignSpaceExplorer::db(), debugLog, DesignSpaceExplorer::evaluate(), frequency_, TestApplication::maxRuntime(), minBus_, minFU_, minimizeBuses(), minimizeFunctionUnits(), minimizeRegisterFiles(), and minRF_.

Referenced by explore().

Here is the call graph for this function:

◆ minimizeRegisterFiles()

RowID MinimizeMachine::minimizeRegisterFiles ( RowID  confToMinimize,
std::vector< ClockCycleCount > &  maxCycleCounts 
)
inlineprivate

Reduces the number of register files in the machine as much as possible to still achieve the application run time requirements.

This function won't handle implementations.

Parameters
confToMinimizeID of the machine configuration which register files are reduced.
maxCycleCountsMax cycle counts per program.
Returns
ID of the new congiguration where register files are reduced or same that was given if nothing was done.

Definition at line 414 of file MinimizeMachine.cc.

416 {
417
418 DSDBManager& dsdb = db();
419 RowID latestConfID = 0;
420
422 DesignSpaceExplorer explorer;
423 explorer.setDSDB(dsdb);
424
426 dsdb.configuration(confToMinimize);
427
428 const TTAMachine::Machine* origMach = NULL;
429 try {
430 origMach = dsdb.architecture(configuration.architectureID);
431 } catch (const Exception& e) {
432 debugLog(std::string("No machine architecture found in config id "
433 "by MimimizeMachine plugin. "));
434 delete origMach;
435 return confToMinimize;
436 }
437
439 modifier.analyzeRegisters(*origMach, origRegisterMap);
440
441 CostEstimates estimates;
442
444 startConf.architectureID = dsdb.addArchitecture(*origMach);
445 startConf.hasImplementation = false;
446
447 // evaluates the desing with all dsdb apps
448 if (!explorer.evaluate(startConf, estimates, false)) {
449 // can't evaluate the given configuration
450 delete origMach;
451 origMach = NULL;
452 return confToMinimize;
453 }
454
455 // check if some apps maxCycles was exceeded
456 if (!checkCycleCounts(startConf, maxCycleCounts)) {
457 delete origMach;
458 origMach = NULL;
459 return confToMinimize;
460 }
461
462 MachineResourceModifier::RegisterMap::const_iterator registerMapIter =
463 origRegisterMap.begin();
464
465 ObjectState* currentState = origMach->saveState();
466 // go through all different register file types
467 for (; registerMapIter != origRegisterMap.end(); registerMapIter++) {
469 mach.loadState(currentState);
472
473 int i = 0;
474 rfNav = mach.registerFileNavigator();
475 // go through every register file in the machine to find matching RF
476 while (i < rfNav.count()) {
477 if (((*registerMapIter).second)->isArchitectureEqual(
478 *rfNav.item(i))) {
479
480 // remove the register file
481 mach.removeRegisterFile(*rfNav.item(i));
482 std::list<std::string> socketList;
483 modifier.removeNotConnectedSockets(mach, socketList);
484
485 DSDBManager::MachineConfiguration newConfiguration;
486 RowID confID = 0;
487 CostEstimates newEstimates;
488
489 // if the evaluation fails the removed RF is needed
490 // and the old machine state is loaded
491 if (!evalNewConfigWithoutImplementation(explorer, mach,
492 dsdb, newConfiguration, confID, newEstimates)) {
493
494 // continue with old machine state and
495 // try with next register file type
496 break;
497 }
498
499 // check every apps new cycle counts against
500 // maxCycleCounts
501 if (!checkCycleCounts(newConfiguration, maxCycleCounts)) {
502 // continue with old machine state and
503 // try with next register file type
504 break;
505 }
506 latestConfID = confID;
507
508 // save the new machine state
509 delete currentState;
510 currentState = mach.saveState();
511
512 // else continue removing same register types
513 // no need to advance the rf navigator,
514 // because of the removal
515 continue;
516 }
517 // if the registers did not match, try next one in the machine
518 i++;
519 }
520 }
521
522 delete origMach;
523 origMach = NULL;
524 if (latestConfID != 0) {
525 return latestConfID;
526 } else {
527 // no new config could be created
528 return confToMinimize;
529 }
530 }
std::multimap< double, TTAMachine::RegisterFile * > RegisterMap
Map of register amounts in percents.
void analyzeRegisters(const TTAMachine::Machine &mach, RegisterMap &registerMap) const
virtual RegisterFileNavigator registerFileNavigator() const
Definition Machine.cc:450
virtual void removeRegisterFile(RegisterFile &unit)
Definition Machine.cc:554

References DSDBManager::addArchitecture(), MachineResourceModifier::analyzeRegisters(), DSDBManager::architecture(), DSDBManager::MachineConfiguration::architectureID, checkCycleCounts(), DSDBManager::configuration(), TTAMachine::Machine::Navigator< ComponentType >::count(), DesignSpaceExplorer::db(), debugLog, evalNewConfigWithoutImplementation(), DesignSpaceExplorer::evaluate(), DSDBManager::MachineConfiguration::hasImplementation, TTAMachine::Machine::Navigator< ComponentType >::item(), TTAMachine::Machine::loadState(), TTAMachine::Machine::registerFileNavigator(), MachineResourceModifier::removeNotConnectedSockets(), TTAMachine::Machine::removeRegisterFile(), TTAMachine::Machine::saveState(), and DesignSpaceExplorer::setDSDB().

Referenced by minimizeMachine().

Here is the call graph for this function:

◆ PLUGIN_DESCRIPTION()

MinimizeMachine::PLUGIN_DESCRIPTION ( "Removes resources until the real time " "requirements of applications are not reached anymore."  )
private

◆ producesArchitecture()

virtual bool MinimizeMachine::producesArchitecture ( ) const
inlineprivatevirtual

Implements DesignSpaceExplorerPlugin.

Definition at line 90 of file MinimizeMachine.cc.

90{ return true; }

◆ readParameters()

void MinimizeMachine::readParameters ( )
inlineprivate

Reads the parameters given to the plugin.

Definition at line 135 of file MinimizeMachine.cc.

135 {
137
141 }
void readCompulsoryParameter(const std::string paramName, T &param) const
void readOptionalParameter(const std::string paramName, T &param) const

References frequency_, frequencyPN_, minBus_, minBusPN_, minFU_, minFUPN_, minRF_, minRFPN_, DesignSpaceExplorerPlugin::readCompulsoryParameter(), and DesignSpaceExplorerPlugin::readOptionalParameter().

Referenced by explore().

Here is the call graph for this function:

◆ requiresHDB()

virtual bool MinimizeMachine::requiresHDB ( ) const
inlineprivatevirtual

Implements DesignSpaceExplorerPlugin.

Definition at line 91 of file MinimizeMachine.cc.

91{ return true; }

◆ requiresSimulationData()

virtual bool MinimizeMachine::requiresSimulationData ( ) const
inlineprivatevirtual

Implements DesignSpaceExplorerPlugin.

Definition at line 92 of file MinimizeMachine.cc.

92{ return false; }

◆ requiresStartingPointArchitecture()

virtual bool MinimizeMachine::requiresStartingPointArchitecture ( ) const
inlineprivatevirtual

Implements DesignSpaceExplorerPlugin.

Definition at line 89 of file MinimizeMachine.cc.

89{ return true; }

Member Data Documentation

◆ frequency_

unsigned int MinimizeMachine::frequency_
private

running frequency in MHz for apps

Definition at line 130 of file MinimizeMachine.cc.

Referenced by explore(), minimizeMachine(), and readParameters().

◆ frequencyPN_

const std::string MinimizeMachine::frequencyPN_
staticprivate

Definition at line 121 of file MinimizeMachine.cc.

Referenced by MinimizeMachine(), and readParameters().

◆ minBus_

bool MinimizeMachine::minBus_
private

minimize busses

Definition at line 124 of file MinimizeMachine.cc.

Referenced by MinimizeMachine(), minimizeMachine(), and readParameters().

◆ minBusPN_

const std::string MinimizeMachine::minBusPN_
staticprivate

Definition at line 118 of file MinimizeMachine.cc.

Referenced by MinimizeMachine(), and readParameters().

◆ minFU_

bool MinimizeMachine::minFU_
private

minimize function units

Definition at line 126 of file MinimizeMachine.cc.

Referenced by MinimizeMachine(), minimizeMachine(), and readParameters().

◆ minFUPN_

const std::string MinimizeMachine::minFUPN_
staticprivate

Definition at line 119 of file MinimizeMachine.cc.

Referenced by MinimizeMachine(), and readParameters().

◆ minRF_

bool MinimizeMachine::minRF_
private

minimize register files

Definition at line 128 of file MinimizeMachine.cc.

Referenced by MinimizeMachine(), minimizeMachine(), and readParameters().

◆ minRFPN_

const std::string MinimizeMachine::minRFPN_
staticprivate

Definition at line 120 of file MinimizeMachine.cc.

Referenced by MinimizeMachine(), and readParameters().


The documentation for this class was generated from the following file: