env.hpp Source File

env.hpp Source File#

Composable Kernel: env.hpp Source File
tile/core/utility/env.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2025, Advanced Micro Devices, Inc. All rights reserved.
3
4#pragma once
5
6#include <iostream>
7#include <string>
8
9namespace ck_tile {
10
11template <typename... Args>
12void CK_TILE_ERROR(Args&&... args) noexcept
13{
14 std::ostringstream oss;
15 (oss << ... << args);
16 std::cerr << "[ERROR] " << oss.str() << std::endl;
17}
18
19namespace internal {
20
21template <size_t N>
22bool is_any_of(const char* const (&names)[N], const std::string& str)
23{
24 return std::any_of(std::begin(names), std::end(names), [&](const char* inner_str) {
25 return str == inner_str;
26 });
27};
28
29template <typename T>
31{
32};
33template <>
34struct ParseEnvVal<bool>
35{
36 static bool parse_env_var_value(const char* vp)
37 {
38 std::string value_env_str{vp};
39
40 for(auto& c : value_env_str)
41 {
42 if(std::isalpha(c) != 0)
43 {
44 c = std::tolower(static_cast<unsigned char>(c));
45 }
46 }
47
48 if(is_any_of(enabled_names, value_env_str))
49 {
50 return true;
51 }
52 else if(is_any_of(disabled_names, value_env_str))
53 {
54 return false;
55 }
56 else
57 {
58 throw std::runtime_error("Invalid value for env variable");
59 }
60
61 return false;
62 }
63
64 private:
65 static constexpr const char* enabled_names[] = {"enable", "enabled", "1", "yes", "on", "true"};
66 static constexpr const char* disabled_names[] = {
67 "disable", "disabled", "0", "no", "off", "false"};
68};
69
70// Supports hexadecimals (with leading "0x"), octals (if prefix is "0") and decimals (default).
71// Returns 0 if environment variable is in wrong format (strtoull fails to parse the string).
72template <>
74{
75 static uint64_t parse_env_var_value(const char* vp) { return std::strtoull(vp, nullptr, 0); }
76};
77
78template <>
79struct ParseEnvVal<std::string>
80{
81 static std::string parse_env_var_value(const char* vp) { return std::string{vp}; }
82};
83
84template <typename T>
85struct EnvVar
86{
87 private:
88 T value{};
89 bool is_unset = true;
90
91 public:
92 const T& GetValue() const { return value; }
93
94 bool IsUnset() const { return is_unset; }
95
96 void Unset() { is_unset = true; }
97
98 void UpdateValue(const T& val)
99 {
100 is_unset = false;
101 value = val;
102 }
103
104 explicit EnvVar(const char* const name, const T& def_val)
105 {
106 // NOLINTNEXTLINE (concurrency-mt-unsafe)
107 const char* vp = std::getenv(name);
108 if(vp != nullptr) // a value was provided
109 {
110 is_unset = false;
112 }
113 else // no value provided, use default value
114 {
115 value = def_val;
116 }
117 }
118};
119} // end namespace internal
120
121// Static inside function hides the variable and provides
122// thread-safety/locking
123// Used in global namespace
124#define CK_TILE_DECLARE_ENV_VAR(name, type, default_val) \
125 namespace ck_tile::env { \
126 struct name \
127 { \
128 static_assert(std::is_same_v<name, ::ck_tile::env::name>, \
129 "CK_TILE_DECLARE_ENV* must be used in the global namespace"); \
130 using value_type = type; \
131 static ck_tile::internal::EnvVar<type>& Ref() \
132 { \
133 static ck_tile::internal::EnvVar<type> var{#name, default_val}; \
134 return var; \
135 } \
136 }; \
137 }
138
139#define CK_TILE_DECLARE_ENV_VAR_BOOL(name) CK_TILE_DECLARE_ENV_VAR(name, bool, false)
140
141#define CK_TILE_DECLARE_ENV_VAR_UINT64(name) CK_TILE_DECLARE_ENV_VAR(name, uint64_t, 0)
142
143#define CK_TILE_DECLARE_ENV_VAR_STR(name) CK_TILE_DECLARE_ENV_VAR(name, std::string, "")
144
145#define CK_TILE_ENV(name) \
146 ck_tile::env::name {}
147
148template <class EnvVar>
149inline const std::string& EnvGetString(EnvVar)
150{
151 static_assert(std::is_same_v<typename EnvVar::value_type, std::string>);
152 return EnvVar::Ref().GetValue();
153}
154
155template <class EnvVar>
156inline bool EnvIsEnabled(EnvVar)
157{
158 static_assert(std::is_same_v<typename EnvVar::value_type, bool>);
159 return !EnvVar::Ref().IsUnset() && EnvVar::Ref().GetValue();
160}
161
162template <class EnvVar>
163inline bool EnvIsDisabled(EnvVar)
164{
165 static_assert(std::is_same_v<typename EnvVar::value_type, bool>);
166 return !EnvVar::Ref().IsUnset() && !EnvVar::Ref().GetValue();
167}
168
169template <class EnvVar>
170inline uint64_t EnvValue(EnvVar)
171{
172 static_assert(std::is_same_v<typename EnvVar::value_type, uint64_t>);
173 return EnvVar::Ref().GetValue();
174}
175
176template <class EnvVar>
177inline bool EnvIsUnset(EnvVar)
178{
179 return EnvVar::Ref().IsUnset();
180}
181
182template <class EnvVar>
183void EnvUnset(EnvVar)
184{
185 EnvVar::Ref().Unset();
186}
187
189template <typename EnvVar, typename ValueType>
190void UpdateEnvVar(EnvVar, const ValueType& val)
191{
192 static_assert(std::is_same_v<typename EnvVar::value_type, ValueType>);
193 EnvVar::Ref().UpdateValue(val);
194}
195
196template <typename EnvVar>
197void UpdateEnvVar(EnvVar, const std::string_view& val)
198{
199 EnvVar::Ref().UpdateValue(
201 val.data()));
202}
203
204} // namespace ck_tile
205
206// environment variable to enable logging:
207// export CK_TILE_LOGGING=ON or CK_TILE_LOGGING=1 or CK_TILE_LOGGING=ENABLED
208CK_TILE_DECLARE_ENV_VAR_BOOL(CK_TILE_LOGGING)
bool is_any_of(const char *const (&names)[N], const std::string &str)
Definition tile/core/utility/env.hpp:22
Definition tile/core/algorithm/cluster_descriptor.hpp:13
bool EnvIsEnabled(EnvVar)
Definition tile/core/utility/env.hpp:156
void CK_TILE_ERROR(Args &&... args) noexcept
Definition tile/core/utility/env.hpp:12
bool EnvIsUnset(EnvVar)
Definition tile/core/utility/env.hpp:177
uint64_t EnvValue(EnvVar)
Definition tile/core/utility/env.hpp:170
void UpdateEnvVar(EnvVar, const ValueType &val)
Updates the cached value of an environment variable.
Definition tile/core/utility/env.hpp:190
bool EnvIsDisabled(EnvVar)
Definition tile/core/utility/env.hpp:163
const std::string & EnvGetString(EnvVar)
Definition tile/core/utility/env.hpp:149
void EnvUnset(EnvVar)
Definition tile/core/utility/env.hpp:183
Definition allocators.h:459
STL namespace.
unsigned __int64 uint64_t
Definition stdint.h:136
void UpdateValue(const T &val)
Definition tile/core/utility/env.hpp:98
EnvVar(const char *const name, const T &def_val)
Definition tile/core/utility/env.hpp:104
void Unset()
Definition tile/core/utility/env.hpp:96
const T & GetValue() const
Definition tile/core/utility/env.hpp:92
bool IsUnset() const
Definition tile/core/utility/env.hpp:94
static bool parse_env_var_value(const char *vp)
Definition tile/core/utility/env.hpp:36
static std::string parse_env_var_value(const char *vp)
Definition tile/core/utility/env.hpp:81
static uint64_t parse_env_var_value(const char *vp)
Definition tile/core/utility/env.hpp:75
Definition tile/core/utility/env.hpp:31
#define CK_TILE_DECLARE_ENV_VAR_BOOL(name)
Definition tile/core/utility/env.hpp:139