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>
47 return "link-clone-prune";
49 return "link-clone-light";
59 const char *EnvValue = std::getenv(
VarName);
63 return std::string(EnvValue);
68 const char *EnvValue = std::getenv(
VarName);
69 return EnvValue ? EnvValue[0] : Default;
74 const char *EnvValue = std::getenv(
VarName);
75 return EnvValue ?
static_cast<bool>(std::stoi(EnvValue)) : Default;
80 const char *EnvValue = std::getenv(
VarName);
81 return EnvValue ? std::stoi(EnvValue) : Default;
85 std::transform(CGstr.begin(), CGstr.end(), CGstr.begin(), ::tolower);
88 if (CGstr ==
"serial")
90 if (CGstr ==
"parallel")
99 const char *EnvValue = std::getenv(
VarName);
109 return JSONValue.value();
121 const char *EnvValue = std::getenv(
VarName);
126 std::istringstream Stream(EnvValue);
128 while (std::getline(Stream, Token,
';')) {
131 if (Token ==
"specialization")
133 else if (Token ==
"ir-dump")
135 else if (Token ==
"kernel-trace")
137 else if (Token ==
"cache-stats")
148 const char *EnvValue = std::getenv(
VarName);
152 std::string EnvValueStr{EnvValue};
153 std::transform(EnvValueStr.begin(), EnvValueStr.end(), EnvValueStr.begin(),
155 if (EnvValueStr ==
"link-clone-prune")
157 if (EnvValueStr ==
"link-clone-light")
159 if (EnvValueStr ==
"cross-clone")
162 Logger::outs(
"proteus") <<
"Unknown kernel clone option " << EnvValueStr
163 <<
", using default: " <<
toString(Default) <<
"\n";
168 using LaunchDim = std::array<unsigned int, 3>;
171 constexpr bool SupportOnlyRTC =
172#if defined(PROTEUS_ENABLE_CUDA)
178 Logger::outs(
"proteus") <<
"Warning: Proteus supports only RTC in the "
179 "current build system configuration, "
180 "defaulting Codegen to RTC\n";
183 return ProteusCodegen;
186 static std::optional<LaunchDim> getTunedDim(
const llvm::json::Object &
Config,
187 llvm::StringRef Key) {
192 const auto *Object = Value->getAsObject();
195 ": expected an object with x, y, z");
198 const char *Axes[] = {
"x",
"y",
"z"};
199 for (
unsigned I = 0; I < Dim.size(); ++I) {
200 const char *Axis = Axes[I];
201 auto Coordinate = Object->getInteger(Axis);
202 if (!Coordinate || *Coordinate <= 0 ||
203 static_cast<uint64_t
>(*Coordinate) >
204 std::numeric_limits<unsigned int>::max())
206 ": expected a positive 32-bit integer");
207 Dim[I] =
static_cast<unsigned int>(*Coordinate);
212 std::optional<const std::string> ProteusOptPipeline;
214 bool ProteusSpecializeArgs;
215 bool ProteusSpecializeLaunchBounds;
216 bool ProteusSpecializeDims;
217 bool ProteusSpecializeDimsRange;
218 char ProteusOptLevel;
219 int ProteusCodeGenOptLevel;
222 std::optional<LaunchDim> TunedGridDim;
223 std::optional<LaunchDim> TunedBlockDim;
227 bool ProteusSpecializeLaunchBounds,
228 bool ProteusSpecializeDims,
229 bool ProteusSpecializeDimsRange,
char ProteusOptLevel,
230 int ProteusCodeGenOptLevel,
int TunedMaxThreads = -1,
231 int MinBlocksPerSM = 0,
232 std::optional<LaunchDim> TunedGridDim = std::nullopt,
233 std::optional<LaunchDim> TunedBlockDim = std::nullopt)
234 : ProteusOptPipeline(ProteusOptPipeline), ProteusCodegen(ProteusCodegen),
235 ProteusSpecializeArgs(ProteusSpecializeArgs),
236 ProteusSpecializeLaunchBounds(ProteusSpecializeLaunchBounds),
237 ProteusSpecializeDims(ProteusSpecializeDims),
238 ProteusSpecializeDimsRange(ProteusSpecializeDimsRange),
239 ProteusOptLevel(ProteusOptLevel),
240 ProteusCodeGenOptLevel(ProteusCodeGenOptLevel),
241 TunedMaxThreads(TunedMaxThreads), MinBlocksPerSM(MinBlocksPerSM),
242 TunedGridDim(TunedGridDim), TunedBlockDim(TunedBlockDim) {}
261 auto Pipeline =
Config.getString(
"Pipeline");
262 std::optional<std::string> ProteusPipeline;
264 ProteusPipeline = Pipeline.value().str();
270 llvm::StringRef(
"rtc"))
278 llvm::StringRef(
"3"))[0],
280 static_cast<int64_t
>(3)),
282 static_cast<int64_t
>(-1L)),
284 static_cast<int64_t
>(0L)),
285 getTunedDim(
Config,
"GridDim"), getTunedDim(
Config,
"BlockDim"));
296 return ProteusOptPipeline;
298 const std::optional<LaunchDim> &
gridDim()
const {
return TunedGridDim; }
299 const std::optional<LaunchDim> &
blockDim()
const {
return TunedBlockDim; }
306 if (TunedMaxThreads != MaxThreads)
308 return MinBlocksPerSM;
311 template <
typename T>
void dump(T &OS)
const {
312 if (ProteusOptPipeline)
313 OS <<
"Pipeline:" << ProteusOptPipeline.value() <<
" ";
315 OS <<
"CG:" <<
toString(ProteusCodegen) <<
" ";
316 OS <<
"SA:" << ProteusSpecializeArgs <<
" ";
317 OS <<
"LB:" << ProteusSpecializeLaunchBounds <<
" ";
318 OS <<
"SD:" << ProteusSpecializeDims <<
" ";
319 OS <<
"SDR:" << ProteusSpecializeDimsRange <<
" ";
320 OS <<
"OL:" << ProteusOptLevel <<
" ";
321 OS <<
"CGL:" << ProteusCodeGenOptLevel <<
" ";
322 OS <<
"TMT:" << TunedMaxThreads <<
" ";
323 OS <<
"BPSM:" << MinBlocksPerSM <<
" ";
325 OS <<
"GridDim:(" << (*TunedGridDim)[0] <<
"," << (*TunedGridDim)[1]
326 <<
"," << (*TunedGridDim)[2] <<
") ";
328 OS <<
"BlockDim:(" << (*TunedBlockDim)[0] <<
"," << (*TunedBlockDim)[1]
329 <<
"," << (*TunedBlockDim)[2] <<
") ";
333inline llvm::StringMap<const CodeGenerationConfig>
335 llvm::StringMap<const CodeGenerationConfig> TunedConfigs;
339 auto JSONRoot = [&JSONFn]() -> std::optional<llvm::json::Object> {
340 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> JSONBuf =
341 llvm::MemoryBuffer::getFile(JSONFn.value(),
true,
345 JSONBuf.getError().message() +
"\n");
347 llvm::json::Value JsonInfo =
348 llvm::cantFail(llvm::json::parse(JSONBuf.get()->getBuffer()),
349 "Cannot convert buffer to json value");
351 if (
auto *Obj = JsonInfo.getAsObject())
359 for (
auto &KV : JSONRoot.value()) {
361 if (
const auto *Options = KV.second.getAsObject()) {
362 TunedConfigs.try_emplace(
422 void dump(llvm::raw_ostream &OS)
const {
423 auto PrintOut = [](llvm::StringRef ID,
425 llvm::SmallString<128> S;
426 llvm::raw_svector_ostream OS(S);
427 OS <<
"ID:" << ID <<
" ";
439 OS << PrintOut(KV.getKey(), KV.second) <<
"\n";
483#define PROTEUS_TIMER_OUTPUT(x) \
484 if (::proteus::Config::get().ProteusEnableTimers) \
const void const char * VarName
Definition CompilerInterfaceDevice.cpp:32
const std::optional< LaunchDim > & blockDim() const
Definition Config.h:299
void dump(T &OS) const
Definition Config.h:311
int minBlocksPerSM(int MaxThreads) const
Definition Config.h:301
bool specializeArgs() const
Definition Config.h:289
const std::optional< LaunchDim > & gridDim() const
Definition Config.h:298
bool specializeDimsRange() const
Definition Config.h:291
static CodeGenerationConfig createFromJSONEntry(const llvm::json::Object &Config)
Definition Config.h:260
bool specializeLaunchBounds() const
Definition Config.h:292
std::optional< const std::string > optPipeline() const
Definition Config.h:295
static CodeGenerationConfig createFromEnv()
Definition Config.h:245
bool specializeDims() const
Definition Config.h:290
char optLevel() const
Definition Config.h:293
CodegenOption codeGenOption() const
Definition Config.h:288
int codeGenOptLevel() const
Definition Config.h:294
int ProteusCommThreadPollMs
Definition Config.h:395
unsigned ProteusTraceConfig
Definition Config.h:386
bool ProteusDisable
Definition Config.h:378
static Config & get()
Definition Config.h:371
std::string ProteusObjectCacheChain
Definition Config.h:391
bool traceKernels() const
Definition Config.h:415
bool ProteusRelinkGlobalsByCopy
Definition Config.h:380
const llvm::StringMap< const CodeGenerationConfig > TunedConfigs
Definition Config.h:376
bool traceIRDump() const
Definition Config.h:412
std::optional< const std::string > ProteusClangxxBin
Definition Config.h:389
bool traceCacheStats() const
Definition Config.h:418
bool ProteusDumpLLVMIR
Definition Config.h:379
bool ProteusDebugOutput
Definition Config.h:387
const CodeGenerationConfig GlobalCodeGenConfig
Definition Config.h:375
bool ProteusUseStoredCache
Definition Config.h:377
int ProteusAsyncThreads
Definition Config.h:382
KernelCloneOption ProteusKernelClone
Definition Config.h:384
void dump(llvm::raw_ostream &OS) const
Definition Config.h:422
std::optional< const std::string > ProteusNvccBin
Definition Config.h:390
const CodeGenerationConfig & getCGConfig(llvm::StringRef KName="") const
Definition Config.h:397
int ProteusTimeTraceGrainUs
Definition Config.h:394
std::optional< const std::string > ProteusCacheDir
Definition Config.h:388
bool ProteusEnableTimers
Definition Config.h:385
bool traceSpecializations() const
Definition Config.h:408
bool ProteusAsyncTestBlocking
Definition Config.h:383
bool ProteusEnableTimeTrace
Definition Config.h:392
bool ProteusAsyncCompilation
Definition Config.h:381
std::string ProteusTimeTraceFile
Definition Config.h:393
Definition KernelName.h:18
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:78
TraceOption
Definition Config.h:113
std::optional< std::string > getEnvOrDefaultString(const char *VarName)
Definition Config.h:57
void reportFatalError(const llvm::Twine &Reason, const char *FILE, unsigned Line)
Definition Error.cpp:14
CodegenOption
Definition Config.h:19
CodegenOption getEnvOrDefaultCG(const char *VarName, CodegenOption Default)
Definition Config.h:96
unsigned parseTraceConfig(const char *VarName)
Definition Config.h:120
KernelCloneOption
Definition Config.h:25
std::string toString(CodegenOption Option)
Definition Config.h:31
KernelCloneOption getEnvOrDefaultKC(const char *VarName, KernelCloneOption Default)
Definition Config.h:145
llvm::StringMap< const CodeGenerationConfig > parseJSONConfig(std::optional< std::string > JSONFn)
Definition Config.h:334
T getDefaultValueFromOptional(std::optional< T > JSONValue, T Default)
Definition Config.h:107
char getEnvOrDefaultChar(const char *VarName, char Default)
Definition Config.h:66
CodegenOption strToCG(std::string CGstr)
Definition Config.h:84
bool getEnvOrDefaultBool(const char *VarName, bool Default)
Definition Config.h:72