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/Logger.hpp"
7
8namespace proteus {
9
10enum class CodegenOption {
11 RTC,
12 Serial,
15};
16
22
23inline std::string toString(CodegenOption Option) {
24 switch (Option) {
26 return "RTC";
28 return "Serial";
30 return "Parallel";
32 return "ParallelThinLTO";
33 default:
34 return "Unknown";
35 }
36}
37
38inline std::string toString(KernelCloneOption Option) {
39 switch (Option) {
41 return "link-clone-prune";
43 return "link-clone-light";
45 return "cross-clone";
46 default:
47 return "Unknown";
48 }
49}
50
51inline bool getEnvOrDefaultBool(const char *VarName, bool Default) {
52
53 const char *EnvValue = std::getenv(VarName);
54 return EnvValue ? static_cast<bool>(std::stoi(EnvValue)) : Default;
55}
56
57inline int getEnvOrDefaultInt(const char *VarName, int Default) {
58
59 const char *EnvValue = std::getenv(VarName);
60 return EnvValue ? std::stoi(EnvValue) : Default;
61}
62
64 CodegenOption Default) {
65
66 const char *EnvValue = std::getenv(VarName);
67 if (!EnvValue)
68 return Default;
69
70 std::string EnvValueStr{EnvValue};
71 std::transform(EnvValueStr.begin(), EnvValueStr.end(), EnvValueStr.begin(),
72 ::tolower);
73 if (EnvValueStr == "rtc")
74 return CodegenOption::RTC;
75 if (EnvValueStr == "serial")
77 if (EnvValueStr == "parallel")
79 if (EnvValueStr == "thinlto")
81
82 Logger::outs("proteus") << "Unknown codegen option " << EnvValueStr
83 << ", using default codegen option: "
84 << toString(Default) << "\n";
85 return Default;
86}
87
89 KernelCloneOption Default) {
90
91 const char *EnvValue = std::getenv(VarName);
92 if (!EnvValue)
93 return Default;
94
95 std::string EnvValueStr{EnvValue};
96 std::transform(EnvValueStr.begin(), EnvValueStr.end(), EnvValueStr.begin(),
97 ::tolower);
98 if (EnvValueStr == "link-clone-prune")
100 if (EnvValueStr == "link-clone-light")
102 if (EnvValueStr == "cross-clone")
104
105 Logger::outs("proteus") << "Unknown kernel clone option " << EnvValueStr
106 << ", using default: " << toString(Default) << "\n";
107 return Default;
108}
109
110class Config {
111public:
112 static Config &get() {
113 static Config Conf;
114 return Conf;
115 }
116
131
132private:
133 Config() {
135 getEnvOrDefaultBool("PROTEUS_USE_STORED_CACHE", true);
137 getEnvOrDefaultBool("PROTEUS_SPECIALIZE_LAUNCH_BOUNDS", true);
139 getEnvOrDefaultBool("PROTEUS_SPECIALIZE_ARGS", true);
141 getEnvOrDefaultBool("PROTEUS_SPECIALIZE_DIMS", true);
143#if PROTEUS_ENABLE_CUDA
145 Logger::outs("proteus")
146 << "Warning: Proteus supports only RTC compilation for CUDA, "
147 "setting Codegen to RTC\n";
149 }
150#endif
151#if PROTEUS_ENABLE_HIP
152#if LLVM_VERSION_MAJOR < 18
154 Logger::outs("proteus")
155 << "Warning: Proteus with LLVM < 18 supports only RTC compilation, "
156 "setting Codegen to RTC\n";
158 }
159#endif
160#endif
161 ProteusDisable = getEnvOrDefaultBool("PROTEUS_DISABLE", false);
162 ProteusDumpLLVMIR = getEnvOrDefaultBool("PROTEUS_DUMP_LLVM_IR", false);
164 getEnvOrDefaultBool("PROTEUS_RELINK_GLOBALS_BY_COPY", false);
166 getEnvOrDefaultBool("PROTEUS_ASYNC_COMPILATION", false);
168 getEnvOrDefaultBool("PROTEUS_ASYNC_TEST_BLOCKING", false);
169 ProteusAsyncThreads = getEnvOrDefaultInt("PROTEUS_ASYNC_THREADS", 1);
170 ProteusKernelClone = getEnvOrDefaultKC("PROTEUS_KERNEL_CLONE",
172 ProteusEnableTimers = getEnvOrDefaultBool("PROTEUS_ENABLE_TIMERS", false);
173 ProteusTraceOutput = getEnvOrDefaultBool("PROTEUS_TRACE_OUTPUT", false);
174 }
175};
176} // namespace proteus
177
178#endif
const char * VarName
Definition CompilerInterfaceDevice.cpp:20
Definition Config.hpp:110
CodegenOption ProteusCodegen
Definition Config.hpp:129
bool ProteusDisable
Definition Config.hpp:121
static Config & get()
Definition Config.hpp:112
bool ProteusRelinkGlobalsByCopy
Definition Config.hpp:123
bool ProteusSpecializeDims
Definition Config.hpp:120
bool ProteusDumpLLVMIR
Definition Config.hpp:122
bool ProteusTraceOutput
Definition Config.hpp:130
bool ProteusUseStoredCache
Definition Config.hpp:117
int ProteusAsyncThreads
Definition Config.hpp:125
KernelCloneOption ProteusKernelClone
Definition Config.hpp:127
bool ProteusSpecializeArgs
Definition Config.hpp:119
bool ProteusEnableTimers
Definition Config.hpp:128
bool ProteusAsyncTestBlocking
Definition Config.hpp:126
bool ProteusSpecializeLaunchBounds
Definition Config.hpp:118
bool ProteusAsyncCompilation
Definition Config.hpp:124
static llvm::raw_ostream & outs(const std::string &Name)
Definition Logger.hpp:25
Definition Dispatcher.cpp:14
int getEnvOrDefaultInt(const char *VarName, int Default)
Definition Config.hpp:57
CodegenOption
Definition Config.hpp:10
CodegenOption getEnvOrDefaultCG(const char *VarName, CodegenOption Default)
Definition Config.hpp:63
KernelCloneOption
Definition Config.hpp:17
std::string toString(CodegenOption Option)
Definition Config.hpp:23
KernelCloneOption getEnvOrDefaultKC(const char *VarName, KernelCloneOption Default)
Definition Config.hpp:88
bool getEnvOrDefaultBool(const char *VarName, bool Default)
Definition Config.hpp:51