Proteus
Programmable JIT compilation and optimization for C/C++ using LLVM
Loading...
Searching...
No Matches
Config.hpp
Go to the documentation of this file.
1#ifndef PROTEUS_CONFIG_HPP
2#define PROTEUS_CONFIG_HPP
3
4#include <string>
5
6#include "proteus/Error.h"
7#include "proteus/Logger.hpp"
8
9namespace proteus {
10
11enum class CodegenOption {
12 RTC,
13 Serial,
15};
16
22
23inline std::string toString(CodegenOption Option) {
24 switch (Option) {
26 return "RTC";
28 return "Serial";
30 return "Parallel";
31 default:
32 return "Unknown";
33 }
34}
35
36inline std::string toString(KernelCloneOption Option) {
37 switch (Option) {
39 return "link-clone-prune";
41 return "link-clone-light";
43 return "cross-clone";
44 default:
45 return "Unknown";
46 }
47}
48
49inline std::optional<std::string> getEnvOrDefaultString(const char *VarName) {
50
51 const char *EnvValue = std::getenv(VarName);
52 if (!EnvValue)
53 return std::nullopt;
54
55 return std::string(EnvValue);
56}
57
58inline bool getEnvOrDefaultBool(const char *VarName, bool Default) {
59
60 const char *EnvValue = std::getenv(VarName);
61 return EnvValue ? static_cast<bool>(std::stoi(EnvValue)) : Default;
62}
63
64inline int getEnvOrDefaultInt(const char *VarName, int Default) {
65
66 const char *EnvValue = std::getenv(VarName);
67 return EnvValue ? std::stoi(EnvValue) : Default;
68}
69
71 CodegenOption Default) {
72
73 const char *EnvValue = std::getenv(VarName);
74 if (!EnvValue)
75 return Default;
76
77 std::string EnvValueStr{EnvValue};
78 std::transform(EnvValueStr.begin(), EnvValueStr.end(), EnvValueStr.begin(),
79 ::tolower);
80 if (EnvValueStr == "rtc")
81 return CodegenOption::RTC;
82 if (EnvValueStr == "serial")
84 if (EnvValueStr == "parallel")
86
87 PROTEUS_FATAL_ERROR("Unknown codegen option: " + EnvValueStr);
88}
89
91 KernelCloneOption Default) {
92
93 const char *EnvValue = std::getenv(VarName);
94 if (!EnvValue)
95 return Default;
96
97 std::string EnvValueStr{EnvValue};
98 std::transform(EnvValueStr.begin(), EnvValueStr.end(), EnvValueStr.begin(),
99 ::tolower);
100 if (EnvValueStr == "link-clone-prune")
102 if (EnvValueStr == "link-clone-light")
104 if (EnvValueStr == "cross-clone")
106
107 Logger::outs("proteus") << "Unknown kernel clone option " << EnvValueStr
108 << ", using default: " << toString(Default) << "\n";
109 return Default;
110}
111
112class Config {
113public:
114 static Config &get() {
115 static Config Conf;
116 return Conf;
117 }
118
133 std::optional<const std::string> ProteusOptPipeline;
134 std::optional<const std::string> ProteusCacheDir;
135
136private:
137 Config()
138 : ProteusOptPipeline(getEnvOrDefaultString("PROTEUS_OPT_PIPELINE")),
139 ProteusCacheDir(getEnvOrDefaultString("PROTEUS_CACHE_DIR")) {
141 getEnvOrDefaultBool("PROTEUS_USE_STORED_CACHE", true);
143 getEnvOrDefaultBool("PROTEUS_SPECIALIZE_LAUNCH_BOUNDS", true);
145 getEnvOrDefaultBool("PROTEUS_SPECIALIZE_ARGS", true);
147 getEnvOrDefaultBool("PROTEUS_SPECIALIZE_DIMS", true);
149#if PROTEUS_ENABLE_CUDA
151 Logger::outs("proteus")
152 << "Warning: Proteus supports only RTC compilation for CUDA, "
153 "setting Codegen to RTC\n";
155 }
156#endif
157#if PROTEUS_ENABLE_HIP
158#if LLVM_VERSION_MAJOR < 18
160 Logger::outs("proteus")
161 << "Warning: Proteus with LLVM < 18 supports only RTC compilation, "
162 "setting Codegen to RTC\n";
164 }
165#endif
166#endif
167 ProteusDisable = getEnvOrDefaultBool("PROTEUS_DISABLE", false);
168 ProteusDumpLLVMIR = getEnvOrDefaultBool("PROTEUS_DUMP_LLVM_IR", false);
170 getEnvOrDefaultBool("PROTEUS_RELINK_GLOBALS_BY_COPY", false);
172 getEnvOrDefaultBool("PROTEUS_ASYNC_COMPILATION", false);
174 getEnvOrDefaultBool("PROTEUS_ASYNC_TEST_BLOCKING", false);
175 ProteusAsyncThreads = getEnvOrDefaultInt("PROTEUS_ASYNC_THREADS", 1);
176 ProteusKernelClone = getEnvOrDefaultKC("PROTEUS_KERNEL_CLONE",
178 ProteusEnableTimers = getEnvOrDefaultBool("PROTEUS_ENABLE_TIMERS", false);
179 ProteusTraceOutput = getEnvOrDefaultInt("PROTEUS_TRACE_OUTPUT", 0);
180 }
181};
182} // namespace proteus
183
184#endif
const char * VarName
Definition CompilerInterfaceDevice.cpp:20
#define PROTEUS_FATAL_ERROR(x)
Definition Error.h:7
Definition Config.hpp:112
int ProteusTraceOutput
Definition Config.hpp:132
CodegenOption ProteusCodegen
Definition Config.hpp:131
bool ProteusDisable
Definition Config.hpp:123
static Config & get()
Definition Config.hpp:114
bool ProteusRelinkGlobalsByCopy
Definition Config.hpp:125
bool ProteusSpecializeDims
Definition Config.hpp:122
bool ProteusDumpLLVMIR
Definition Config.hpp:124
std::optional< const std::string > ProteusOptPipeline
Definition Config.hpp:133
bool ProteusUseStoredCache
Definition Config.hpp:119
int ProteusAsyncThreads
Definition Config.hpp:127
KernelCloneOption ProteusKernelClone
Definition Config.hpp:129
bool ProteusSpecializeArgs
Definition Config.hpp:121
std::optional< const std::string > ProteusCacheDir
Definition Config.hpp:134
bool ProteusEnableTimers
Definition Config.hpp:130
bool ProteusAsyncTestBlocking
Definition Config.hpp:128
bool ProteusSpecializeLaunchBounds
Definition Config.hpp:120
bool ProteusAsyncCompilation
Definition Config.hpp:126
static llvm::raw_ostream & outs(const std::string &Name)
Definition Logger.hpp:25
Definition BuiltinsCUDA.cpp:4
int getEnvOrDefaultInt(const char *VarName, int Default)
Definition Config.hpp:64
std::optional< std::string > getEnvOrDefaultString(const char *VarName)
Definition Config.hpp:49
CodegenOption
Definition Config.hpp:11
CodegenOption getEnvOrDefaultCG(const char *VarName, CodegenOption Default)
Definition Config.hpp:70
KernelCloneOption
Definition Config.hpp:17
std::string toString(CodegenOption Option)
Definition Config.hpp:23
KernelCloneOption getEnvOrDefaultKC(const char *VarName, KernelCloneOption Default)
Definition Config.hpp:90
bool getEnvOrDefaultBool(const char *VarName, bool Default)
Definition Config.hpp:58