12 #ifndef SST_CORE_STATAPI_STATBASE_H 13 #define SST_CORE_STATAPI_STATBASE_H 15 #include "sst/core/eli/elementinfo.h" 16 #include "sst/core/factory.h" 17 #include "sst/core/oneshot.h" 18 #include "sst/core/params.h" 19 #include "sst/core/serialization/serializable.h" 20 #include "sst/core/sst_types.h" 21 #include "sst/core/statapi/statfieldinfo.h" 22 #include "sst/core/warnmacros.h" 30 namespace Statistics {
31 class StatisticOutput;
32 class StatisticFieldsOutput;
33 class StatisticProcessingEngine;
43 StatisticInfo(
const std::string& name,
const Params& params) : name(name), params(params) {}
68 typedef enum { STAT_MODE_UNDEFINED, STAT_MODE_COUNT, STAT_MODE_PERIODIC, STAT_MODE_DUMP_AT_END }
StatMode_t;
72 void enable() { m_statEnabled =
true; }
99 static const std::vector<ElementInfoParam>& ELI_getParams();
117 inline const std::string&
getStatName()
const {
return m_statName; }
129 inline const StatisticFieldInfo::fieldType_t&
getStatDataType()
const {
return m_statDataType; }
134 return StatisticFieldInfo::getFieldTypeShortName(m_statDataType);
140 return StatisticFieldInfo::getFieldTypeFullName(m_statDataType);
220 void setRegisteredCollectionMode(
StatMode_t mode) { m_registeredCollectionMode = mode; }
223 static std::string buildStatisticFullName(
const char* compName,
const char* statName,
const char* statSubId);
225 buildStatisticFullName(
const std::string& compName,
const std::string& statName,
const std::string& statSubId);
232 virtual void registerOutputFields(StatisticFieldsOutput* statOutput) = 0;
239 virtual void outputStatisticFields(StatisticFieldsOutput* statOutput,
bool EndOfSimFlag) = 0;
246 virtual bool isStatModeSupported(
StatMode_t UNUSED(mode))
const {
return true; }
249 bool operator==(StatisticBase& checkStat);
252 void initializeStatName(
const char* compName,
const char* statName,
const char* statSubId);
253 void initializeStatName(
const std::string& compName,
const std::string& statName,
const std::string& statSubId);
255 void initializeProperties();
256 void checkEventForOutput();
259 void delayOutputExpiredHandler();
260 void delayCollectionExpiredHandler();
262 const StatisticGroup* getGroup()
const {
return m_group; }
263 void setGroup(
const StatisticGroup* group) { m_group = group; }
269 BaseComponent* m_component;
270 std::string m_statName;
271 std::string m_statSubId;
272 std::string m_statFullName;
273 std::string m_statTypeName;
276 uint64_t m_currentCollectionCount;
277 uint64_t m_outputCollectionCount;
278 uint64_t m_collectionCountLimit;
279 StatisticFieldInfo::fieldType_t m_statDataType;
282 bool m_outputEnabled;
283 bool m_resetCountOnOutput;
284 bool m_clearDataOnOutput;
285 bool m_outputAtEndOfSim;
287 bool m_outputDelayed;
288 bool m_collectionDelayed;
289 bool m_savedStatEnabled;
290 bool m_savedOutputEnabled;
293 const StatisticGroup* m_group;
302 template <class T, bool F = std::is_fundamental<T>::value>
309 virtual void addData_impl(T data) = 0;
319 for ( uint64_t i = 0; i < N; ++i ) {
325 template <
class... Args>
328 virtual void addData_impl(Args... args) = 0;
338 for ( uint64_t i = 0; i < N; ++i ) {
339 addData_impl(args...);
343 template <
class... InArgs>
344 void addData(InArgs&&... args)
346 addData_impl(std::make_tuple(std::forward<InArgs>(args)...));
360 template <
typename T>
361 class Statistic :
public StatisticBase,
public StatisticCollector<T>
364 SST_ELI_DECLARE_BASE(Statistic)
365 SST_ELI_DECLARE_INFO(
366 ELI::ProvidesInterface,
368 SST_ELI_DECLARE_CTOR(BaseComponent*,
const std::string&,
const std::string&,
SST::Params&)
371 using StatisticCollector<T>::addData_impl;
372 using StatisticCollector<T>::addData_impl_Ntimes;
378 template <
class... InArgs>
384 addData_impl(std::forward<InArgs>(args)...);
389 template <
class... InArgs>
390 void addDataNTimes(uint64_t N, InArgs&&... args)
395 addData_impl_Ntimes(N, std::forward<InArgs>(args)...);
400 static fieldType_t fieldId() {
return StatisticFieldType<T>::id(); }
434 SST_ELI_DECLARE_INFO(
464 using CustomStatistic = Statistic<void>;
466 template <
class... Args>
467 using MultiStatistic = Statistic<std::tuple<Args...>>;
472 std::string toString()
const;
474 Statistics::fieldType_t fieldId()
const {
return field_; }
476 const char* fieldName()
const {
return field_name_; }
478 const char* fieldShortName()
const {
return short_name_; }
483 field_name_(T::ELI_fieldName()),
484 short_name_(T::ELI_fieldShortName()),
485 field_(T::ELI_registerField(T::ELI_fieldName(), T::ELI_fieldShortName()))
489 const char* field_name_;
490 const char* short_name_;
491 Statistics::fieldType_t field_;
494 #define SST_ELI_DECLARE_STATISTIC_TEMPLATE(cls, lib, name, version, desc, interface) \ 495 SST_ELI_DEFAULT_INFO(lib, name, ELI_FORWARD_AS_ONE(version), desc) \ 496 SST_ELI_INTERFACE_INFO(interface) 498 #define SST_ELI_REGISTER_CUSTOM_STATISTIC(cls, lib, name, version, desc) \ 499 SST_ELI_REGISTER_DERIVED(SST::Statistics::CustomStatistic,cls,lib,name,ELI_FORWARD_AS_ONE(version),desc) \ 500 SST_ELI_INTERFACE_INFO("CustomStatistic") 502 #define SST_ELI_DECLARE_STATISTIC(cls, field, lib, name, version, desc, interface) \ 503 static bool ELI_isLoaded() \ 505 return SST::Statistics::Statistic<field>::template addDerivedInfo<cls>(lib, name) && \ 506 SST::Statistics::Statistic<field>::template addDerivedBuilder<cls>(lib, name) && \ 507 SST::Statistics::Statistic<field>::template addDerivedInfo<SST::Statistics::NullStatistic<field>>( \ 509 SST::Statistics::Statistic<field>::template addDerivedBuilder<SST::Statistics::NullStatistic<field>>( \ 512 SST_ELI_DEFAULT_INFO(lib, name, ELI_FORWARD_AS_ONE(version), desc) \ 513 SST_ELI_INTERFACE_INFO(interface) \ 514 static const char* ELI_fieldName() { return #field; } \ 515 static const char* ELI_fieldShortName() { return #field; } 517 #ifdef __INTEL_COMPILER 518 #define SST_ELI_INSTANTIATE_STATISTIC(cls, field) \ 519 bool force_instantiate_##cls##_##field = \ 520 SST::ELI::InstantiateBuilderInfo<SST::Statistics::Statistic<field>, cls<field>>::isLoaded() && \ 521 SST::ELI::InstantiateBuilder<SST::Statistics::Statistic<field>, cls<field>>::isLoaded() && \ 522 SST::ELI::InstantiateBuilderInfo< \ 523 SST::Statistics::Statistic<field>, SST::Statistics::NullStatistic<field>>::isLoaded() && \ 524 SST::ELI::InstantiateBuilder< \ 525 SST::Statistics::Statistic<field>, SST::Statistics::NullStatistic<field>>::isLoaded(); 527 #define SST_ELI_INSTANTIATE_STATISTIC(cls, field) \ 528 struct cls##_##field##_##shortName : public cls<field> \ 530 cls##_##field##_##shortName( \ 531 SST::BaseComponent* bc, const std::string& sn, const std::string& si, SST::Params& p) : \ 532 cls<field>(bc, sn, si, p) \ 534 static bool ELI_isLoaded() \ 536 return SST::ELI::InstantiateBuilderInfo< \ 537 SST::Statistics::Statistic<field>, cls##_##field##_##shortName>::isLoaded() && \ 538 SST::ELI::InstantiateBuilder< \ 539 SST::Statistics::Statistic<field>, cls##_##field##_##shortName>::isLoaded() && \ 540 SST::ELI::InstantiateBuilderInfo< \ 541 SST::Statistics::Statistic<field>, SST::Statistics::NullStatistic<field>>::isLoaded() && \ 542 SST::ELI::InstantiateBuilder< \ 543 SST::Statistics::Statistic<field>, SST::Statistics::NullStatistic<field>>::isLoaded(); \ 548 #define PP_NARG(...) PP_NARG_(__VA_ARGS__, PP_NSEQ()) 549 #define PP_NARG_(...) PP_ARG_N(__VA_ARGS__) 550 #define PP_ARG_N(_1, _2, _3, _4, _5, N, ...) N 551 #define PP_NSEQ() 5, 4, 3, 2, 1, 0 553 #define PP_GLUE(X, Y) PP_GLUE_I(X, Y) 554 #define PP_GLUE_I(X, Y) X##Y 556 #define STAT_NAME1(base, a) base##a 557 #define STAT_NAME2(base, a, b) base##a##b 558 #define STAT_NAME3(base, a, b, c) base##a##b##c 559 #define STAT_NAME4(base, a, b, c, d) base##a##b##c##d 561 #define STAT_GLUE_NAME(base, ...) PP_GLUE(STAT_NAME, PP_NARG(__VA_ARGS__))(base, __VA_ARGS__) 562 #define STAT_TUPLE(...) std::tuple<__VA_ARGS__> 564 #ifdef __INTEL_COMPILER 565 #define MAKE_MULTI_STATISTIC(cls, name, tuple, ...) \ 566 bool force_instantiate_stat_name = \ 567 SST::ELI::InstantiateBuilderInfo<SST::Statistics::Statistic<tuple>, cls<__VA_ARGS__>>::isLoaded() && \ 568 SST::ELI::InstantiateBuilder<SST::Statistics::Statistic<tuple>, cls<__VA_ARGS__>>::isLoaded() && \ 569 SST::ELI::InstantiateBuilderInfo< \ 570 SST::Statistics::Statistic<tuple>, SST::Statistics::NullStatistic<tuple>>::isLoaded() && \ 571 SST::ELI::InstantiateBuilder< \ 572 SST::Statistics::Statistic<tuple>, SST::Statistics::NullStatistic<tuple>>::isLoaded(); \ 577 #define MAKE_MULTI_STATISTIC(cls, name, tuple, ...) \ 578 struct name : public cls<__VA_ARGS__> \ 580 name(SST::BaseComponent* bc, const std::string& sn, const std::string& si, SST::Params& p) : \ 581 cls<__VA_ARGS__>(bc, sn, si, p) \ 583 bool ELI_isLoaded() const \ 585 return SST::ELI::InstantiateBuilderInfo<SST::Statistics::Statistic<tuple>, name>::isLoaded() && \ 586 SST::ELI::InstantiateBuilder<SST::Statistics::Statistic<tuple>, name>::isLoaded() && \ 587 SST::ELI::InstantiateBuilderInfo< \ 588 SST::Statistics::Statistic<tuple>, SST::Statistics::NullStatistic<tuple>>::isLoaded() && \ 589 SST::ELI::InstantiateBuilder< \ 590 SST::Statistics::Statistic<tuple>, SST::Statistics::NullStatistic<tuple>>::isLoaded(); \ 595 #define SST_ELI_INSTANTIATE_MULTI_STATISTIC(cls, ...) \ 596 MAKE_MULTI_STATISTIC(cls, STAT_GLUE_NAME(cls, __VA_ARGS__), STAT_TUPLE(__VA_ARGS__), __VA_ARGS__) 602 #include "sst/core/statapi/statnull.h" 604 #endif // SST_CORE_STATAPI_STATBASE_H This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition: serializer.h:35
void setFlagOutputAtEndOfSim(bool flag)
Set the Output At End Of Sim flag.
Definition: statbase.h:110
virtual void setCollectionCountLimit(uint64_t newLimit)
Set the collection count limit to a defined value.
Definition: statbase.cc:94
bool isOutputEnabled() const
Return the enable status of the Statistic's ability to output data.
Definition: statbase.h:150
void delayCollection(const char *delayTime)
Delay the statistic from collecting data for a specified delay time.
Definition: statbase.cc:175
void setFlagClearDataOnOutput(bool flag)
Set the Clear Data On Output flag.
Definition: statbase.h:105
Forms the base class for statistics output generation within the SST core.
Definition: statoutput.h:49
void addData(InArgs &&... args)
Add data to the Statistic This will call the addData_impl() routine in the derived Statistic...
Definition: statbase.h:379
const StatisticFieldInfo::fieldType_t & getStatDataType() const
Return the Statistic data type.
Definition: statbase.h:129
Forms the base class for statistics gathering within SST.
Definition: statbase.h:64
virtual void addData_impl_Ntimes(uint64_t N, T data)
addData_impl_Ntimes Add the same data N times in a row By default, this just calls the addData functi...
Definition: statbase.h:317
const std::string & getStatName() const
Return the Statistic Name.
Definition: statbase.h:117
void setStatisticTypeName(const char *typeName)
Set an optional Statistic Type Name.
Definition: statbase.h:214
const char * getStatDataTypeFullName() const
Return the Statistic data type.
Definition: statbase.h:138
void enable()
Enable Statistic for collections.
Definition: statbase.h:72
bool getFlagResetCountOnOutput() const
Return the ResetCountOnOutput flag value.
Definition: statbase.h:159
void delayOutput(const char *delayTime)
Delay the statistic from outputting data for a specified delay time.
Definition: statbase.cc:160
Forms the template defined base class for statistics gathering within SST.
Definition: elementinfo.h:44
SSTHandlerBaseNoArgs< void > HandlerBase
Base handler for OneShot callbacks.
Definition: oneshot.h:38
Statistic(BaseComponent *comp, const std::string &statName, const std::string &statSubId, Params &statParams)
Construct a Statistic.
Definition: statbase.h:454
const std::string & getCompName() const
Return the Component Name.
Definition: statbase.cc:50
Definition: serializable.h:118
bool getFlagClearDataOnOutput() const
Return the ClearDataOnOutput flag value.
Definition: statbase.h:162
uint64_t getCollectionCountLimit() const
Return the collection count limit.
Definition: statbase.h:153
BaseComponent * getComponent() const
Return a pointer to the parent Component.
Definition: statbase.h:144
virtual void resetCollectionCount()
Set the current collection count to 0.
Definition: statbase.cc:88
Base type that creates the virtual addData(...) interface Used for distinguishing fundamental types...
Definition: statbase.h:303
bool getFlagOutputAtEndOfSim() const
Return the OutputAtEndOfSim flag value.
Definition: statbase.h:165
Statistic(BaseComponent *comp, const std::string &statName, const std::string &statSubId, Params &statParams)
Construct a Statistic.
Definition: statbase.h:413
Definition: paramsInfo.h:40
const char * getStatDataTypeShortName() const
Return the Statistic data type.
Definition: statbase.h:132
virtual void incrementCollectionCount(uint64_t increment)
Increment current collection count.
Definition: statbase.cc:72
Definition: statoutput.h:157
virtual bool isNullStatistic() const
Indicate if the Statistic is a NullStatistic.
Definition: statbase.h:186
bool isEnabled() const
Return the enable status of the Statistic.
Definition: statbase.h:147
Main component object for the simulation.
Definition: baseComponent.h:51
void disable()
Disable Statistic for collections.
Definition: statbase.h:75
const std::string & getStatTypeName() const
Return the Statistic type name.
Definition: statbase.h:126
Definition: statbase.h:469
StatMode_t
Statistic collection mode.
Definition: statbase.h:68
virtual void clearStatisticData()
Inform the Statistic to clear its data.
Definition: statbase.h:79
virtual void addData_impl_Ntimes(uint64_t N, Args... args)
addData_impl_Ntimes Add the same data N times in a row By default, this just calls the addData functi...
Definition: statbase.h:336
const std::string & getStatSubId() const
Return the Statistic SubId.
Definition: statbase.h:120
void setFlagResetCountOnOutput(bool flag)
Set the Reset Count On Output flag.
Definition: statbase.h:97
Parameter store.
Definition: params.h:55
Definition: statbase.h:36
Class for instantiating Components, Links and the like out of element libraries.
Definition: factory.h:43
virtual void setCollectionCount(uint64_t newCount)
Set the current collection count to a defined value.
Definition: statbase.cc:80
void setStatisticDataType(const StatisticFieldInfo::fieldType_t dataType)
Set the Statistic Data Type.
Definition: statbase.h:211
StatMode_t getRegisteredCollectionMode() const
Return the collection mode that is registered.
Definition: statbase.h:168
An SST core component that handles timing and event processing informing all registered Statistics to...
Definition: statengine.h:51
Definition: statgroup.h:28
Params & getParams()
Return the Statistic Parameters.
Definition: statbase.h:208
Definition: interfaceInfo.h:18
virtual bool isReady() const
Indicate that the Statistic is Ready to be used.
Definition: statbase.h:183
StatisticBase(BaseComponent *comp, const std::string &statName, const std::string &statSubId, Params &statParams)
Construct a StatisticBase.
Definition: statbase.cc:29
const std::string & getFullStatName() const
Return the full Statistic name of Component.StatName.SubId.
Definition: statbase.h:123
uint64_t getCollectionCount() const
Return the current collection count.
Definition: statbase.h:156