1#ifndef PROTEUS_CONFIG_H
2#define PROTEUS_CONFIG_H
7#include "llvm/ADT/StringMap.h"
8#include <llvm/Support/JSON.h>
9#include <llvm/Support/MemoryBuffer.h>
44 return "link-clone-prune";
46 return "link-clone-light";
56 const char *EnvValue = std::getenv(
VarName);
60 return std::string(EnvValue);
65 const char *EnvValue = std::getenv(
VarName);
66 return EnvValue ? EnvValue[0] : Default;
71 const char *EnvValue = std::getenv(
VarName);
72 return EnvValue ?
static_cast<bool>(std::stoi(EnvValue)) : Default;
77 const char *EnvValue = std::getenv(
VarName);
78 return EnvValue ? std::stoi(EnvValue) : Default;
82 std::transform(CGstr.begin(), CGstr.end(), CGstr.begin(), ::tolower);
85 if (CGstr ==
"serial")
87 if (CGstr ==
"parallel")
96 const char *EnvValue = std::getenv(
VarName);
106 return JSONValue.value();
118 const char *EnvValue = std::getenv(
VarName);
123 std::istringstream Stream(EnvValue);
125 while (std::getline(Stream, Token,
';')) {
128 if (Token ==
"specialization")
130 else if (Token ==
"ir-dump")
132 else if (Token ==
"kernel-trace")
134 else if (Token ==
"cache-stats")
145 const char *EnvValue = std::getenv(
VarName);
149 std::string EnvValueStr{EnvValue};
150 std::transform(EnvValueStr.begin(), EnvValueStr.end(), EnvValueStr.begin(),
152 if (EnvValueStr ==
"link-clone-prune")
154 if (EnvValueStr ==
"link-clone-light")
156 if (EnvValueStr ==
"cross-clone")
159 Logger::outs(
"proteus") <<
"Unknown kernel clone option " << EnvValueStr
160 <<
", using default: " <<
toString(Default) <<
"\n";
165 static constexpr bool DefaultSpecializeDimsRange =
166#if PROTEUS_ENABLE_CUDA
175 constexpr bool SupportOnlyRTC =
176#if defined(PROTEUS_ENABLE_CUDA)
182 Logger::outs(
"proteus") <<
"Warning: Proteus supports only RTC in the "
183 "current build system configuration, "
184 "defaulting Codegen to RTC\n";
187 return ProteusCodegen;
190 std::optional<const std::string> ProteusOptPipeline;
192 bool ProteusSpecializeArgs;
193 bool ProteusSpecializeLaunchBounds;
194 bool ProteusSpecializeDims;
195 bool ProteusSpecializeDimsRange;
196 char ProteusOptLevel;
197 int ProteusCodeGenOptLevel;
203 bool ProteusSpecializeLaunchBounds,
204 bool ProteusSpecializeDims,
205 bool ProteusSpecializeDimsRange,
char ProteusOptLevel,
206 int ProteusCodeGenOptLevel,
int TunedMaxThreads = -1,
207 int MinBlocksPerSM = 0)
208 : ProteusOptPipeline(ProteusOptPipeline), ProteusCodegen(ProteusCodegen),
209 ProteusSpecializeArgs(ProteusSpecializeArgs),
210 ProteusSpecializeLaunchBounds(ProteusSpecializeLaunchBounds),
211 ProteusSpecializeDims(ProteusSpecializeDims),
212 ProteusSpecializeDimsRange(ProteusSpecializeDimsRange),
213 ProteusOptLevel(ProteusOptLevel),
214 ProteusCodeGenOptLevel(ProteusCodeGenOptLevel),
215 TunedMaxThreads(TunedMaxThreads), MinBlocksPerSM(MinBlocksPerSM) {}
226 DefaultSpecializeDimsRange),
233 auto Pipeline =
Config.getString(
"Pipeline");
234 std::optional<std::string> ProteusPipeline;
236 ProteusPipeline = Pipeline.value().str();
242 llvm::StringRef(
"rtc"))
248 DefaultSpecializeDimsRange),
250 llvm::StringRef(
"3"))[0],
252 static_cast<int64_t
>(3)),
254 static_cast<int64_t
>(-1L)),
256 static_cast<int64_t
>(0L)));
267 return ProteusOptPipeline;
275 if (TunedMaxThreads != MaxThreads)
277 return MinBlocksPerSM;
280 template <
typename T>
void dump(T &OS)
const {
281 if (ProteusOptPipeline)
282 OS <<
"Pipeline:" << ProteusOptPipeline.value() <<
" ";
284 OS <<
"CG:" <<
toString(ProteusCodegen) <<
" ";
285 OS <<
"SA:" << ProteusSpecializeArgs <<
" ";
286 OS <<
"LB:" << ProteusSpecializeLaunchBounds <<
" ";
287 OS <<
"SD:" << ProteusSpecializeDims <<
" ";
288 OS <<
"SDR:" << ProteusSpecializeDimsRange <<
" ";
289 OS <<
"OL:" << ProteusOptLevel <<
" ";
290 OS <<
"CGL:" << ProteusCodeGenOptLevel <<
" ";
291 OS <<
"TMT:" << TunedMaxThreads <<
" ";
292 OS <<
"BPSM:" << MinBlocksPerSM <<
" ";
296inline llvm::StringMap<const CodeGenerationConfig>
298 llvm::StringMap<const CodeGenerationConfig> TunedConfigs;
302 auto JSONRoot = [&JSONFn]() -> std::optional<llvm::json::Object> {
303 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> JSONBuf =
304 llvm::MemoryBuffer::getFile(JSONFn.value(),
true,
308 JSONBuf.getError().message() +
"\n");
310 llvm::json::Value JsonInfo =
311 llvm::cantFail(llvm::json::parse(JSONBuf.get()->getBuffer()),
312 "Cannot convert buffer to json value");
314 if (
auto *Obj = JsonInfo.getAsObject())
322 for (
auto &KV : JSONRoot.value()) {
324 if (
const auto *Options = KV.second.getAsObject()) {
325 TunedConfigs.try_emplace(
383 void dump(llvm::raw_ostream &OS)
const {
384 auto PrintOut = [](llvm::StringRef ID,
386 llvm::SmallString<128> S;
387 llvm::raw_svector_ostream OS(S);
388 OS <<
"ID:" << ID <<
" ";
398 OS << PrintOut(KV.getKey(), KV.second) <<
"\n";
440#define PROTEUS_TIMER_OUTPUT(x) \
441 if (::proteus::Config::get().ProteusEnableTimers) \
const void const char * VarName
Definition CompilerInterfaceDevice.cpp:25
void char * KernelName
Definition CompilerInterfaceDevice.cpp:55
void dump(T &OS) const
Definition Config.h:280
int minBlocksPerSM(int MaxThreads) const
Definition Config.h:270
bool specializeArgs() const
Definition Config.h:260
bool specializeDimsRange() const
Definition Config.h:262
static CodeGenerationConfig createFromJSONEntry(const llvm::json::Object &Config)
Definition Config.h:232
bool specializeLaunchBounds() const
Definition Config.h:263
std::optional< const std::string > optPipeline() const
Definition Config.h:266
static CodeGenerationConfig createFromEnv()
Definition Config.h:218
bool specializeDims() const
Definition Config.h:261
char optLevel() const
Definition Config.h:264
CodegenOption codeGenOption() const
Definition Config.h:259
int codeGenOptLevel() const
Definition Config.h:265
int ProteusCommThreadPollMs
Definition Config.h:356
unsigned ProteusTraceConfig
Definition Config.h:349
bool ProteusDisable
Definition Config.h:341
static Config & get()
Definition Config.h:334
std::string ProteusObjectCacheChain
Definition Config.h:352
bool traceKernels() const
Definition Config.h:376
bool ProteusRelinkGlobalsByCopy
Definition Config.h:343
const llvm::StringMap< const CodeGenerationConfig > TunedConfigs
Definition Config.h:339
bool traceIRDump() const
Definition Config.h:373
bool traceCacheStats() const
Definition Config.h:379
bool ProteusDumpLLVMIR
Definition Config.h:342
bool ProteusDebugOutput
Definition Config.h:350
const CodeGenerationConfig GlobalCodeGenConfig
Definition Config.h:338
bool ProteusUseStoredCache
Definition Config.h:340
int ProteusAsyncThreads
Definition Config.h:345
KernelCloneOption ProteusKernelClone
Definition Config.h:347
void dump(llvm::raw_ostream &OS) const
Definition Config.h:383
const CodeGenerationConfig & getCGConfig(llvm::StringRef KName="") const
Definition Config.h:358
int ProteusTimeTraceGrainUs
Definition Config.h:355
std::optional< const std::string > ProteusCacheDir
Definition Config.h:351
bool ProteusEnableTimers
Definition Config.h:348
bool traceSpecializations() const
Definition Config.h:369
bool ProteusAsyncTestBlocking
Definition Config.h:346
bool ProteusEnableTimeTrace
Definition Config.h:353
bool ProteusAsyncCompilation
Definition Config.h:344
std::string ProteusTimeTraceFile
Definition Config.h:354
static llvm::raw_ostream & outs(const std::string &Name)
Definition Logger.h:25
Definition MemoryCache.h:27
int getEnvOrDefaultInt(const char *VarName, int Default)
Definition Config.h:75
TraceOption
Definition Config.h:110
std::optional< std::string > getEnvOrDefaultString(const char *VarName)
Definition Config.h:54
void reportFatalError(const llvm::Twine &Reason, const char *FILE, unsigned Line)
Definition Error.cpp:14
CodegenOption
Definition Config.h:16
CodegenOption getEnvOrDefaultCG(const char *VarName, CodegenOption Default)
Definition Config.h:93
unsigned parseTraceConfig(const char *VarName)
Definition Config.h:117
KernelCloneOption
Definition Config.h:22
std::string toString(CodegenOption Option)
Definition Config.h:28
KernelCloneOption getEnvOrDefaultKC(const char *VarName, KernelCloneOption Default)
Definition Config.h:142
llvm::StringMap< const CodeGenerationConfig > parseJSONConfig(std::optional< std::string > JSONFn)
Definition Config.h:297
T getDefaultValueFromOptional(std::optional< T > JSONValue, T Default)
Definition Config.h:104
char getEnvOrDefaultChar(const char *VarName, char Default)
Definition Config.h:63
CodegenOption strToCG(std::string CGstr)
Definition Config.h:81
bool getEnvOrDefaultBool(const char *VarName, bool Default)
Definition Config.h:69