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/params.h" 18 #include "sst/core/serialization/serialize_impl_fwd.h" 19 #include "sst/core/sst_types.h" 20 #include "sst/core/statapi/statfieldinfo.h" 21 #include "sst/core/unitAlgebra.h" 22 #include "sst/core/warnmacros.h" 34 namespace Statistics {
35 class StatisticOutput;
36 class StatisticFieldsOutput;
37 class StatisticProcessingEngine;
54 void enable() { stat_enabled_ =
true; }
81 static const std::vector<ElementInfoParam>& ELI_getParams();
97 void setPortModName(std::string& port,
size_t index) { stat_mod_name_ =
"." + port +
"." + std::to_string(index); }
104 inline const std::string&
getStatName()
const {
return stat_name_; }
107 inline const std::string&
getStatSubId()
const {
return stat_sub_id_; }
112 std::string stat_full_name_rtn =
getCompName() +
"." + stat_name_;
113 if ( stat_sub_id_ !=
"" ) stat_full_name_rtn +=
"." + stat_sub_id_;
114 return stat_full_name_rtn;
126 inline const StatisticFieldInfo::fieldType_t&
getStatDataType()
const {
return stat_data_type_; }
131 return StatisticFieldInfo::getFieldTypeShortName(stat_data_type_);
137 return StatisticFieldInfo::getFieldTypeFullName(stat_data_type_);
150 void setStartAtFlag() { flags_ |= Flag::StartAt; }
151 void unsetStartAtFlag() { flags_ &= (~Flag::StartAt); }
155 void setStopAtFlag() { flags_ |= Flag::StopAt; }
156 void unsetStopAtFlag() { flags_ &= (~Flag::StopAt); }
160 void setOutputRateFlag() { flags_ |= Flag::OutputRate; }
161 void unsetOutputRateFlag() { flags_ &= (~Flag::OutputRate); }
164 SimTime_t getStartAtFactor();
165 SimTime_t getStopAtFactor();
166 SimTime_t getOutputRateFactor();
185 bool isOutputEventBased()
const {
return !registered_collection_mode_; }
214 BaseComponent* comp,
const std::string& stat_name,
const std::string& stat_sub_id,
Params& stat_params);
229 void setRegisteredCollectionMode(
bool is_periodic) { registered_collection_mode_ = is_periodic; }
232 static std::string buildStatisticFullName(
const char* comp_name,
const char* stat_name,
const char* stat_sub_id);
233 static std::string buildStatisticFullName(
234 const std::string& comp_name,
const std::string& stat_name,
const std::string& stat_sub_id);
241 virtual void registerOutputFields(StatisticFieldsOutput* stat_output) = 0;
248 virtual void outputStatisticFields(StatisticFieldsOutput* stat_output,
bool end_of_sim_flag) = 0;
255 virtual bool isStatModeSupported(
bool UNUSED(periodic))
const {
return true; }
258 bool operator==(StatisticBase& check_stat);
260 void checkEventForOutput();
262 const StatisticGroup* getGroup()
const {
return group_; }
263 void setGroup(
const StatisticGroup* group) { group_ = group; }
270 enum Flag : uint8_t {
276 std::string stat_name_ =
"";
277 std::string stat_sub_id_ =
"";
278 std::string stat_type_name_ =
"";
279 std::string stat_mod_name_ =
283 bool stat_enabled_ =
true;
284 bool registered_collection_mode_ =
true;
285 uint64_t current_collection_count_ = 0;
286 uint64_t output_collection_count_ = 0;
287 uint64_t collection_count_limit_ = 0;
289 const StatisticGroup* group_ =
nullptr;
291 bool reset_count_on_output_ =
false;
292 bool clear_data_on_output_ =
false;
293 bool output_at_end_of_sim_ =
true;
295 BaseComponent* component_;
296 StatisticFieldInfo::fieldType_t stat_data_type_;
305 template <
class T,
bool = std::is_arithmetic_v<T>>
311 virtual void addData_impl(T data) = 0;
321 for ( uint64_t i = 0; i < N; ++i ) {
329 template <
class... Args>
332 virtual void addData_impl(Args... args) = 0;
342 for ( uint64_t i = 0; i < N; ++i ) {
343 addData_impl(args...);
347 template <
class... InArgs>
348 void addData(InArgs&&... args)
350 addData_impl(std::make_tuple(std::forward<InArgs>(args)...));
353 virtual ~StatisticCollector() =
default;
366 template <
typename T>
367 class Statistic :
public StatisticBase,
public StatisticCollector<T>
370 SST_ELI_DECLARE_BASE(Statistic<T>)
371 SST_ELI_DECLARE_INFO(
372 ELI::ProvidesInterface,
374 SST_ELI_DECLARE_CTOR(BaseComponent*,
const std::string&,
const std::string&,
SST::Params&)
376 SST_ELI_DOCUMENT_PARAMS(
377 {
"rate",
"Frequency at which to output statistic. Must include units. 0ns = output at end of simulation only.",
"0ns" },
378 {
"startat",
"Time at which to enable data collection in this statistic. Must include units. 0ns = always enabled.",
"0ns"},
379 {
"stopat",
"Time at which to disable data collection in this statistic. 0ns = always enabled.",
"0ns"},
380 {
"resetOnOutput",
"Whether to reset the statistic's values after each output.",
"False"}
384 using StatisticCollector<T>::addData_impl;
385 using StatisticCollector<T>::addData_impl_Ntimes;
391 template <
class... InArgs>
397 addData_impl(std::forward<InArgs>(args)...);
402 template <
class... InArgs>
403 void addDataNTimes(uint64_t N, InArgs&&... args)
408 addData_impl_Ntimes(N, std::forward<InArgs>(args)...);
413 static fieldType_t fieldId() {
return StatisticFieldType<T>::id(); }
452 SST_ELI_DECLARE_INFO(
482 using CustomStatistic = Statistic<void>;
484 template <
class... Args>
485 using MultiStatistic = Statistic<std::tuple<Args...>>;
490 std::string toString()
const;
492 Statistics::fieldType_t fieldId()
const {
return field_; }
494 const char* fieldName()
const {
return field_name_; }
496 const char* fieldShortName()
const {
return short_name_; }
501 field_name_(T::ELI_fieldName()),
502 short_name_(T::ELI_fieldShortName()),
503 field_(T::ELI_registerField(T::ELI_fieldName(), T::ELI_fieldShortName()))
507 const char* field_name_;
508 const char* short_name_;
509 Statistics::fieldType_t field_;
513 #define SST_ELI_DECLARE_STATISTIC_TEMPLATE(cls, lib, name, version, desc, interface) \ 514 SST_ELI_DEFAULT_INFO(lib, name, ELI_FORWARD_AS_ONE(version), desc) \ 515 SST_ELI_INTERFACE_INFO(interface) \ 516 virtual std::string getELIName() const override \ 518 return std::string(lib) + "." + name; \ 521 #define SST_ELI_DECLARE_STATISTIC_TEMPLATE_DERIVED(cls, field, lib, name, version, desc, interface) \ 522 using SST::Statistics::Statistic<field>::__EliBaseLevel; \ 523 using typename SST::Statistics::Statistic<field>::__LocalEliBase; \ 524 using typename SST::Statistics::Statistic<field>::__ParentEliBase; \ 526 static constexpr int __EliDerivedLevel = \ 527 std::is_same_v<SST::Statistics::Statistic<field>, cls<field>> ? __EliBaseLevel : __EliBaseLevel + 1; \ 528 SST_ELI_DEFAULT_INFO(lib, name, ELI_FORWARD_AS_ONE(version), desc) \ 529 SST_ELI_INTERFACE_INFO(interface) \ 530 virtual std::string getELIName() const override \ 532 return std::string(lib) + "." + name; \ 535 #define SST_ELI_REGISTER_CUSTOM_STATISTIC(cls, lib, name, version, desc) \ 536 SST_ELI_REGISTER_DERIVED(SST::Statistics::CustomStatistic,cls,lib,name,ELI_FORWARD_AS_ONE(version),desc) \ 537 SST_ELI_INTERFACE_INFO("CustomStatistic") 539 #define SST_ELI_DECLARE_STATISTIC(cls, field, lib, name, version, desc, interface) \ 540 static bool ELI_isLoaded() \ 542 return SST::Statistics::Statistic<field>::template addDerivedInfo<cls>(lib, name) && \ 543 SST::Statistics::Statistic<field>::template addDerivedBuilder<cls>(lib, name) && \ 544 SST::Statistics::Statistic<field>::template addDerivedInfo<SST::Statistics::NullStatistic<field>>( \ 546 SST::Statistics::Statistic<field>::template addDerivedBuilder<SST::Statistics::NullStatistic<field>>( \ 549 SST_ELI_DEFAULT_INFO(lib, name, ELI_FORWARD_AS_ONE(version), desc) \ 550 SST_ELI_INTERFACE_INFO(interface) \ 551 static const char* ELI_fieldName() \ 555 static const char* ELI_fieldShortName() \ 560 #ifdef __INTEL_COMPILER 561 #define SST_ELI_INSTANTIATE_STATISTIC(cls, field) \ 562 bool force_instantiate_##cls##_##field = \ 563 SST::ELI::InstantiateBuilderInfo<SST::Statistics::Statistic<field>, cls<field>>::isLoaded() && \ 564 SST::ELI::InstantiateBuilder<SST::Statistics::Statistic<field>, cls<field>>::isLoaded() && \ 565 SST::ELI::InstantiateBuilderInfo<SST::Statistics::Statistic<field>, \ 566 SST::Statistics::NullStatistic<field>>::isLoaded() && \ 567 SST::ELI::InstantiateBuilder<SST::Statistics::Statistic<field>, \ 568 SST::Statistics::NullStatistic<field>>::isLoaded(); 570 #define SST_ELI_INSTANTIATE_STATISTIC(cls, field) \ 571 struct cls##_##field##_##shortName : public cls<field> \ 573 cls##_##field##_##shortName( \ 574 SST::BaseComponent* bc, const std::string& sn, const std::string& si, SST::Params& p) : \ 575 cls<field>(bc, sn, si, p) \ 577 static bool ELI_isLoaded() \ 579 return SST::ELI::InstantiateBuilderInfo<SST::Statistics::Statistic<field>, \ 580 cls##_##field##_##shortName>::isLoaded() && \ 581 SST::ELI::InstantiateBuilder<SST::Statistics::Statistic<field>, \ 582 cls##_##field##_##shortName>::isLoaded() && \ 583 SST::ELI::InstantiateBuilderInfo<SST::Statistics::Statistic<field>, \ 584 SST::Statistics::NullStatistic<field>>::isLoaded() && \ 585 SST::ELI::InstantiateBuilder<SST::Statistics::Statistic<field>, \ 586 SST::Statistics::NullStatistic<field>>::isLoaded(); \ 591 #define PP_NARG(...) PP_NARG_(__VA_ARGS__, PP_NSEQ()) 592 #define PP_NARG_(...) PP_ARG_N(__VA_ARGS__) 593 #define PP_ARG_N(_1, _2, _3, _4, _5, N, ...) N 594 #define PP_NSEQ() 5, 4, 3, 2, 1, 0 596 #define PP_GLUE(X, Y) PP_GLUE_I(X, Y) 597 #define PP_GLUE_I(X, Y) X##Y 599 #define STAT_NAME1(base, a) base##a 600 #define STAT_NAME2(base, a, b) base##a##b 601 #define STAT_NAME3(base, a, b, c) base##a##b##c 602 #define STAT_NAME4(base, a, b, c, d) base##a##b##c##d 604 #define STAT_GLUE_NAME(base, ...) PP_GLUE(STAT_NAME, PP_NARG(__VA_ARGS__))(base, __VA_ARGS__) 605 #define STAT_TUPLE(...) std::tuple<__VA_ARGS__> 607 #ifdef __INTEL_COMPILER 608 #define MAKE_MULTI_STATISTIC(cls, name, tuple, ...) \ 609 bool force_instantiate_stat_name = \ 610 SST::ELI::InstantiateBuilderInfo<SST::Statistics::Statistic<tuple>, cls<__VA_ARGS__>>::isLoaded() && \ 611 SST::ELI::InstantiateBuilder<SST::Statistics::Statistic<tuple>, cls<__VA_ARGS__>>::isLoaded() && \ 612 SST::ELI::InstantiateBuilderInfo<SST::Statistics::Statistic<tuple>, \ 613 SST::Statistics::NullStatistic<tuple>>::isLoaded() && \ 614 SST::ELI::InstantiateBuilder<SST::Statistics::Statistic<tuple>, \ 615 SST::Statistics::NullStatistic<tuple>>::isLoaded(); \ 620 #define MAKE_MULTI_STATISTIC(cls, name, tuple, ...) \ 621 struct name : public cls<__VA_ARGS__> \ 623 name(SST::BaseComponent* bc, const std::string& sn, const std::string& si, SST::Params& p) : \ 624 cls<__VA_ARGS__>(bc, sn, si, p) \ 626 bool ELI_isLoaded() const \ 628 return SST::ELI::InstantiateBuilderInfo<SST::Statistics::Statistic<tuple>, name>::isLoaded() && \ 629 SST::ELI::InstantiateBuilder<SST::Statistics::Statistic<tuple>, name>::isLoaded() && \ 630 SST::ELI::InstantiateBuilderInfo<SST::Statistics::Statistic<tuple>, \ 631 SST::Statistics::NullStatistic<tuple>>::isLoaded() && \ 632 SST::ELI::InstantiateBuilder<SST::Statistics::Statistic<tuple>, \ 633 SST::Statistics::NullStatistic<tuple>>::isLoaded(); \ 638 #define SST_ELI_INSTANTIATE_MULTI_STATISTIC(cls, ...) \ 639 MAKE_MULTI_STATISTIC(cls, STAT_GLUE_NAME(cls, __VA_ARGS__), STAT_TUPLE(__VA_ARGS__), __VA_ARGS__) 643 namespace Stat::pvt {
646 void registerStatWithEngineOnRestart(
651 namespace Core::Serialization {
660 switch ( ser.mode() ) {
661 case serializer::SIZER:
662 case serializer::PACK:
665 SST_SER(stat_eli_type);
668 s->serializeStat(ser);
672 case serializer::UNPACK:
674 std::string stat_eli_type;
676 params.
insert(
"type", stat_eli_type);
678 SST_SER(stat_eli_type);
680 if ( stat_eli_type ==
"sst.NullStatistic" ) {
683 stat_eli_type, params,
nullptr,
"",
"", params);
689 std::string stat_name;
691 SimTime_t output_rate_factor;
693 SimTime_t start_at_factor = 0;
694 SimTime_t stop_at_factor = 0;
698 SST_SER(output_rate_factor);
701 stat_eli_type, params, comp, stat_name, stat_id, params);
707 SST_SER(start_at_factor);
710 SST_SER(stop_at_factor);
712 SST::Stat::pvt::registerStatWithEngineOnRestart(s, start_at_factor, stop_at_factor, output_rate_factor);
716 case serializer::MAP:
724 SST_FRIEND_SERIALIZE();
732 #include "sst/core/statapi/statnull.h" 734 #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:42
void setFlagOutputAtEndOfSim(bool flag)
Set the Output At End Of Sim flag.
Definition: statbase.h:92
virtual void setCollectionCount(uint64_t new_count)
Set the current collection count to a defined value.
Definition: statbase.cc:92
bool getStopAtFlag()
Manage StopAt flag.
Definition: statbase.h:154
void setFlagClearDataOnOutput(bool flag)
Set the Clear Data On Output flag.
Definition: statbase.h:87
Forms the base class for statistics output generation within the SST core.
Definition: statoutput.h:52
bool isOutputPeriodic() const
Return the collection mode that is registered.
Definition: statbase.h:184
void addData(InArgs &&... args)
Add data to the Statistic This will call the addData_impl() routine in the derived Statistic...
Definition: statbase.h:392
const StatisticFieldInfo::fieldType_t & getStatDataType() const
Return the Statistic data type.
Definition: statbase.h:126
virtual void setCollectionCountLimit(uint64_t new_limit)
Set the collection count limit to a defined value.
Definition: statbase.cc:106
Base serialize class.
Definition: serialize.h:113
Forms the base class for statistics gathering within SST.
Definition: statbase.h:49
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:319
const std::string & getStatName() const
Return the Statistic Name.
Definition: statbase.h:104
const char * getStatDataTypeFullName() const
Return the Statistic data type.
Definition: statbase.h:135
bool getOutputRateFlag()
Manage OutputRate flag.
Definition: statbase.h:159
void enable()
Enable Statistic for collections.
Definition: statbase.h:54
virtual const std::string & getStatTypeName() const
Return the Statistic type name.
Definition: statbase.h:123
bool getFlagResetCountOnOutput() const
Return the ResetCountOnOutput flag value.
Definition: statbase.h:175
Forms the template defined base class for statistics gathering within SST.
Definition: elementinfo.h:46
void Statistic has special meaning in that it does not collect fields in the usual way through the ad...
Definition: statbase.h:448
bool getFlagClearDataOnOutput() const
Return the ClearDataOnOutput flag value.
Definition: statbase.h:178
uint64_t getCollectionCountLimit() const
Return the collection count limit.
Definition: statbase.h:169
void setStatisticTypeName(const char *type_name)
Set an optional Statistic Type Name (for output)
Definition: statbase.h:223
BaseComponent * getComponent() const
Return a pointer to the parent Component.
Definition: statbase.h:141
virtual void resetCollectionCount()
Set the current collection count to 0.
Definition: statbase.cc:100
const std::string getCompName() const
Return the Component Name.
Definition: statbase.cc:60
Base type that creates the virtual addData(...) interface Used for distinguishing arithmetic types ...
Definition: statbase.h:306
bool getFlagOutputAtEndOfSim() const
Return the OutputAtEndOfSim flag value.
Definition: statbase.h:181
Definition: paramsInfo.h:39
const char * getStatDataTypeShortName() const
Return the Statistic data type.
Definition: statbase.h:129
Definition: statoutput.h:170
virtual bool isNullStatistic() const
Indicate if the Statistic is a NullStatistic.
Definition: statbase.h:192
bool isEnabled() const
Return the enable status of the Statistic.
Definition: statbase.h:144
Main component object for the simulation.
Definition: baseComponent.h:64
void disable()
Disable Statistic for collections.
Definition: statbase.h:57
Definition: statbase.h:487
virtual void clearStatisticData()
Inform the Statistic to clear its data.
Definition: statbase.h:61
Statistic(BaseComponent *comp, const std::string &stat_name, const std::string &stat_sub_id, Params &stat_params)
Construct a Statistic.
Definition: statbase.h:472
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:340
const std::string & getStatSubId() const
Return the Statistic SubId.
Definition: statbase.h:107
void setFlagResetCountOnOutput(bool flag)
Set the Reset Count On Output flag.
Definition: statbase.h:79
Parameter store.
Definition: params.h:63
virtual void incrementCollectionCount(uint64_t increment)
Increment current collection count.
Definition: statbase.cc:84
Class for instantiating Components, Links and the like out of element libraries.
Definition: factory.h:54
void setStatisticDataType(const StatisticFieldInfo::fieldType_t data_type)
Set the Statistic Data Type.
Definition: statbase.h:220
StatisticBase(BaseComponent *comp, const std::string &stat_name, const std::string &stat_sub_id, Params &stat_params)
Construct a StatisticBase.
Definition: statbase.cc:40
virtual void serialize_order(SST::Core::Serialization::serializer &ser) override
Serialization.
Definition: statbase.h:415
An SST core component that handles timing and event processing informing all registered Statistics to...
Definition: statengine.h:54
const std::string getFullStatName() const
Return the full Statistic name of component.stat_name.sub_id.
Definition: statbase.h:110
void insert(const std::string &key, const std::string &value, bool overwrite=true)
Add a key/value pair into the param object.
Definition: params.cc:171
Definition: statgroup.h:31
virtual void serialize_order(SST::Core::Serialization::serializer &ser)
Serialization.
Definition: statbase.cc:169
virtual std::string getELIName() const =0
Return the ELI type of the statistic The ELI registration macro creates this function automatically f...
bool getStartAtFlag()
Return the rate at which the statistic should be output.
Definition: statbase.h:149
Statistic(BaseComponent *comp, const std::string &stat_name, const std::string &stat_sub_id, Params &stat_params)
Construct a Statistic.
Definition: statbase.h:431
Definition: interfaceInfo.h:20
virtual bool isReady() const
Indicate that the Statistic is Ready to be used.
Definition: statbase.h:189
uint64_t getCollectionCount() const
Return the current collection count.
Definition: statbase.h:172
void setPortModName(std::string &port, size_t index)
Set port name if stat is owned by a port module Temporary field until a common base class for element...
Definition: statbase.h:97