00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef Fennel_SimpleExecStreamGovernor_Included
00025 #define Fennel_SimpleExecStreamGovernor_Included
00026
00027 #include "fennel/exec/ExecStreamGovernor.h"
00028
00029 #include <boost/scoped_array.hpp>
00030
00031 FENNEL_BEGIN_NAMESPACE
00032
00040 class FENNEL_EXEC_EXPORT SimpleExecStreamGovernor
00041 : public ExecStreamGovernor
00042 {
00046 uint perGraphAllocation;
00047
00051 inline uint computePerGraphAllocation();
00052
00061 void assignCachePages(
00062 std::vector<SharedExecStream> &streams,
00063 boost::scoped_array<ExecStreamResourceRequirements> const &reqts,
00064 bool assignMin);
00065
00094 uint distributeCachePages(
00095 std::vector<SharedExecStream> &streams,
00096 boost::scoped_array<ExecStreamResourceRequirements> const &reqts,
00097 boost::scoped_array<double> const &sqrtDiffOptMin,
00098 double totalSqrtDiffs,
00099 uint excessAvailable, bool assignOpt);
00100
00101 public:
00102 explicit SimpleExecStreamGovernor(
00103 ExecStreamResourceKnobs const &knobSettings,
00104 ExecStreamResourceQuantity const &resourcesAvailable,
00105 SharedTraceTarget pTraceTarget,
00106 std::string name);
00107
00108 virtual ~SimpleExecStreamGovernor();
00109
00110
00111 virtual bool setResourceKnob(
00112 ExecStreamResourceKnobs const &knob,
00113 ExecStreamResourceKnobType knobType);
00114 virtual bool setResourceAvailability(
00115 ExecStreamResourceQuantity const &available,
00116 ExecStreamResourceType resourceType);
00117 virtual void requestResources(ExecStreamGraph &graph);
00118 virtual void returnResources(ExecStreamGraph &graph);
00119 };
00120
00121 inline uint SimpleExecStreamGovernor::computePerGraphAllocation()
00122 {
00123 return (resourcesAvailable.nCachePages + resourcesAssigned.nCachePages) /
00124 knobSettings.expectedConcurrentStatements;
00125 }
00126
00127 FENNEL_END_NAMESPACE
00128
00129 #endif
00130
00131