12 #ifndef SST_CORE_OUTPUT_H 13 #define SST_CORE_OUTPUT_H 15 #include "sst/core/serialization/serializer_fwd.h" 16 #include "sst/core/warnmacros.h" 29 #ifndef __STDC_FORMAT_MACROS 30 #define __STDC_FORMAT_MACROS 37 #include <unordered_map> 39 extern int main(
int argc,
char** argv);
44 #define CALL_INFO __LINE__, __FILE__, __FUNCTION__ 46 #if defined(__GNUC__) || defined(__clang__) 47 #define CALL_INFO_LONG __LINE__, __FILE__, __PRETTY_FUNCTION__ 49 #define CALL_INFO_LONG __LINE__, __FILE__, __FUNCTION__ 69 static constexpr uint32_t PrintAll = std::numeric_limits<uint32_t>::max();
119 const std::string& localoutputfilename =
"");
178 void init(
const std::string& prefix, uint32_t verbose_level, uint32_t verbose_mask,
output_location_t location,
179 const std::string& localoutputfilename =
"");
189 void output(uint32_t line,
const char* file,
const char* func,
const char* format, ...) const
190 __attribute__((format(printf, 5, 6)))
193 if (
true == m_objInitialized &&
NONE != m_targetLoc ) {
195 va_start(arg, format);
196 outputprintf(line, file, func, format, arg);
205 void output(
const char* format, ...) const __attribute__((format(printf, 2, 3)))
208 if (
true == m_objInitialized &&
NONE != m_targetLoc ) {
210 va_start(arg, format);
211 outputprintf(format, arg);
232 void verbose(uint32_t line,
const char* file,
const char* func, uint32_t output_level, uint32_t output_bits,
233 const char* format, ...) const __attribute__((format(printf, 7, 8)))
237 if (
true == m_objInitialized &&
NONE != m_targetLoc ) {
240 if ( ((output_bits & ~m_verboseMask) == 0) && (output_level <= m_verboseLevel) ) {
242 va_start(arg, format);
243 outputprintf(line, file, func, format, arg);
266 void verbosePrefix(
const char* tempPrefix, uint32_t line,
const char* file,
const char* func, uint32_t output_level,
267 uint32_t output_bits,
const char* format, ...) __attribute__((format(printf, 8, 9)))
272 if (
true == m_objInitialized &&
NONE != m_targetLoc ) {
273 const std::string normalPrefix = m_outputPrefix;
274 m_outputPrefix = tempPrefix;
278 if ( ((output_bits & ~m_verboseMask) == 0) && (output_level <= m_verboseLevel) ) {
280 va_start(arg, format);
281 outputprintf(line, file, func, format, arg);
285 m_outputPrefix = normalPrefix;
306 void debugPrefix(
const char* UNUSED(tempPrefix), uint32_t UNUSED(line),
const char* UNUSED(file),
307 const char* UNUSED(func), uint32_t UNUSED(output_level), uint32_t UNUSED(output_bits),
308 const char* UNUSED(format), ...) __attribute__((format(printf, 8, 9)))
311 #ifdef __SST_DEBUG_OUTPUT__ 314 if (
true == m_objInitialized &&
NONE != m_targetLoc ) {
315 const std::string normalPrefix = m_outputPrefix;
316 m_outputPrefix = tempPrefix;
320 if ( ((output_bits & ~m_verboseMask) == 0) && (output_level <= m_verboseLevel) ) {
322 va_start(arg, format);
323 outputprintf(line, file, func, format, arg);
327 m_outputPrefix = normalPrefix;
351 void debug(uint32_t UNUSED(line),
const char* UNUSED(file),
const char* UNUSED(func), uint32_t UNUSED(output_level),
352 uint32_t UNUSED(output_bits),
const char* UNUSED(format), ...) const __attribute__((format(printf, 7, 8)))
354 #ifdef __SST_DEBUG_OUTPUT__ 356 if (
true == m_objInitialized &&
NONE != m_targetLoc ) {
359 if ( ((output_bits & ~m_verboseMask) == 0) && (output_level <= m_verboseLevel) ) {
361 va_start(arg, format);
362 outputprintf(line, file, func, format, arg);
383 void fatal(uint32_t line,
const char* file,
const char* func,
int exit_code,
const char* format, ...) const
384 __attribute__((format(printf, 6, 7)));
414 void setPrefix(const std::
string& prefix);
456 inline
void flush()
const { std::fflush(*m_targetOutputRef); }
462 static void setFileName(
const std::string& filename);
464 static Output& getDefaultObject() {
return m_defaultObject; }
469 friend class TraceFunction;
472 void openSSTTargetFile()
const;
473 void closeSSTTargetFile();
475 int getMPIWorldRank()
const;
476 int getMPIWorldSize()
const;
477 uint32_t getNumThreads()
const;
478 uint32_t getThreadRank()
const;
479 std::string buildPrefixString(uint32_t line,
const std::string& file,
const std::string& func)
const;
481 void outputprintf(uint32_t line,
const std::string& file,
const std::string& func,
const char* format,
482 va_list arg)
const __attribute__((format(printf, 5, 0)));
484 void outputprintf(
const char* format, va_list arg)
const __attribute__((format(printf, 2, 0)));
487 void outputprintf(uint32_t line,
const std::string& file,
const std::string& func,
const char* format, ...) const
488 __attribute__((format(printf, 5, 6)))
491 va_start(args, format);
492 outputprintf(line, file, func, format, args);
496 void outputprintf(
const char* format, ...) const __attribute__((format(printf, 2, 3)))
499 va_start(args, format);
500 outputprintf(format, args);
504 friend int ::main(
int argc,
char** argv);
505 static Output& setDefaultObject(
const std::string& prefix, uint32_t verbose_level, uint32_t verbose_mask,
508 m_defaultObject.
init(prefix, verbose_level, verbose_mask, location, localoutputfilename);
509 return getDefaultObject();
512 static void setWorldSize(
int num_ranks,
int num_threads,
int mpiRank)
514 m_worldSize_ranks = num_ranks;
515 m_worldSize_threads = num_threads;
519 static void setThreadID(std::thread::id mach, uint32_t user) { m_threadMap.insert(std::make_pair(mach, user)); }
522 bool m_objInitialized;
523 std::string m_outputPrefix;
524 uint32_t m_verboseLevel;
525 uint32_t m_verboseMask;
528 static Output m_defaultObject;
537 std::FILE** m_targetOutputRef;
542 std::FILE** m_targetFileHandleRef;
543 std::string* m_targetFileNameRef;
544 uint32_t* m_targetFileAccessCountRef;
547 static std::string m_sstGlobalSimFileName;
548 static std::FILE* m_sstGlobalSimFileHandle;
549 static uint32_t m_sstGlobalSimFileAccessCount;
552 std::string m_sstLocalFileName;
553 std::FILE* m_sstLocalFileHandle;
554 uint32_t m_sstLocalFileAccessCount;
556 static std::unordered_map<std::thread::id, uint32_t> m_threadMap;
557 static int m_worldSize_ranks;
558 static int m_worldSize_threads;
560 static int m_mpiRank;
589 thread_local
static int trace_level;
590 thread_local
static std::vector<char> indent_array;
593 TraceFunction(uint32_t line,
const char* file,
const char* func,
bool print_sim_info =
true,
bool activate =
true);
600 void output(
const char* format, ...)
const __attribute__((format(printf, 2, 3)));
606 std::string function_;
611 static bool global_active_;
612 static char indent_marker_;
617 #endif // SST_CORE_OUTPUT_H Output object provides consistent method for outputting data to stdout, stderr and/or sst debug file...
Definition: output.h:57
void setVerboseLevel(uint32_t verbose_level)
Sets object verbose level.
Definition: output.cc:103
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition: serializer.h:42
void setOutputLocation(output_location_t location)
Sets object output location.
Definition: output.cc:139
void verbose(uint32_t line, const char *file, const char *func, uint32_t output_level, uint32_t output_bits, const char *format,...) const
Output the verbose message with formatting as specified by the format parameter.
Definition: output.h:232
void fatal(uint32_t line, const char *file, const char *func, int exit_code, const char *format,...) const
Output the fatal message with formatting as specified by the format parameter.
Definition: output.cc:156
output_location_t
Choice of output location.
Definition: output.h:62
void debugPrefix(const char *UNUSED(tempPrefix), uint32_t UNUSED(line), const char *UNUSED(file), const char *UNUSED(func), uint32_t UNUSED(output_level), uint32_t UNUSED(output_bits), const char *UNUSED(format),...)
Output the debug message with formatting as specified by the format parameter.
Definition: output.h:306
void setVerboseMask(uint32_t verbose_mask)
Sets object verbose mask.
Definition: output.cc:115
Output()
Default Constructor.
Definition: output.cc:60
void flush() const
This method allows for the manual flushing of the output.
Definition: output.h:456
void verbosePrefix(const char *tempPrefix, uint32_t line, const char *file, const char *func, uint32_t output_level, uint32_t output_bits, const char *format,...)
Output the verbose message with formatting as specified by the format parameter.
Definition: output.h:266
void debug(uint32_t UNUSED(line), const char *UNUSED(file), const char *UNUSED(func), uint32_t UNUSED(output_level), uint32_t UNUSED(output_bits), const char *UNUSED(format),...) const
Output the debug message with formatting as specified by the format parameter.
Definition: output.h:351
Class to easily trace function enter and exit.
Definition: output.h:587
static void setFileName(const std::string &filename)
This method sets the static filename used by SST.
Definition: output.cc:217
void output(uint32_t line, const char *file, const char *func, const char *format,...) const
Output the message with formatting as specified by the format parameter.
Definition: output.h:189
output_location_t getOutputLocation() const
Returns object output location.
Definition: output.cc:149
uint32_t getVerboseLevel() const
Returns object verbose level.
Definition: output.cc:109
void init(const std::string &prefix, uint32_t verbose_level, uint32_t verbose_mask, output_location_t location, const std::string &localoutputfilename="")
Initialize the object after construction.
Definition: output.cc:73
uint32_t getVerboseMask() const
Returns object verbose mask.
Definition: output.cc:121
void setPrefix(const std::string &prefix)
Sets object prefix.
Definition: output.cc:127
std::string getPrefix() const
Returns object prefix.
Definition: output.cc:133
void output(const char *format,...) const
Output the message with formatting as specified by the format parameter.
Definition: output.h:205
void output(const char *format,...) const
Output the message with formatting as specified by the format parameter.
Definition: output.cc:574