|
#pragma once |
|
#include <cstring> |
|
#include <map> |
|
#include <memory> |
|
#include <ostream> |
|
#include <sstream> |
|
#include <unordered_map> |
|
|
|
#include <c10/core/impl/LocalDispatchKeySet.h> |
|
|
|
namespace at { |
|
namespace vitals { |
|
|
|
TORCH_API bool torchVitalEnabled(); |
|
|
|
struct TORCH_API TorchVitalAttr { |
|
|
|
std::string value = ""; |
|
template <typename T> |
|
TorchVitalAttr& operator<<(const T& t) { |
|
if (torchVitalEnabled()) { |
|
std::stringstream ss; |
|
ss << t; |
|
value += ss.str(); |
|
} |
|
return *this; |
|
} |
|
|
|
template <typename T> |
|
void write(const T& t, bool force) { |
|
if (force || torchVitalEnabled()) { |
|
std::stringstream ss; |
|
ss << t; |
|
value = ss.str(); |
|
} |
|
} |
|
}; |
|
|
|
struct TORCH_API TorchVital { |
|
std::string name; |
|
std::unordered_map<std::string, TorchVitalAttr> attrs; |
|
|
|
explicit TorchVital(std::string n) : name(std::move(n)) {} |
|
TorchVital() = delete; |
|
|
|
TorchVitalAttr& create(const std::string& attr); |
|
TorchVitalAttr& create(const std::string& attr, bool force); |
|
friend std::ostream& operator<<(std::ostream& os, const TorchVital& dt); |
|
|
|
~TorchVital(); |
|
}; |
|
|
|
std::ostream& operator<<(std::ostream& os, TorchVital const& tv); |
|
|
|
|
|
|
|
class TORCH_API APIVitals { |
|
public: |
|
bool vitals_enabled; |
|
|
|
|
|
bool setVital( |
|
const std::string& vital_name, |
|
const std::string& attr_name, |
|
const std::string& value, |
|
bool force = false); |
|
std::string readVitals(); |
|
|
|
APIVitals(); |
|
|
|
|
|
APIVitals(APIVitals const& other) = delete; |
|
APIVitals(APIVitals&& other) = delete; |
|
APIVitals& operator=(const APIVitals&) = delete; |
|
APIVitals& operator=(APIVitals&&) = delete; |
|
|
|
private: |
|
std::unordered_map<std::string, TorchVital> name_map_; |
|
}; |
|
|
|
extern TORCH_API APIVitals VitalsAPI; |
|
|
|
} |
|
} |
|
|
|
#define TORCH_VITAL_DECLARE(name) \ |
|
TORCH_API at::vitals::TorchVital TorchVital_##name; |
|
|
|
#define TORCH_VITAL_DEFINE(name) \ |
|
TORCH_API at::vitals::TorchVital TorchVital_##name(#name); |
|
|
|
#define TORCH_VITAL_BASE(name) TorchVital_##name |
|
|
|
#define TORCH_VITAL(name, attr) TORCH_VITAL_BASE(name).create(#attr) |
|
|