// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. #include #include // clang-format off #include #include // clang-format on #include "debug.h" template T readEnv(const std::string &envName, const T &defaultValue) { const char *envCstr = getenv(envName.c_str()); if (envCstr == nullptr) return defaultValue; if constexpr (std::is_same_v) { return atoi(envCstr); } else if constexpr (std::is_same_v) { return (std::string(envCstr) != "0"); } return T(envCstr); } template void readAndSetEnv(const std::string &envName, T &env) { const char *envCstr = getenv(envName.c_str()); if (envCstr == nullptr) return; if constexpr (std::is_same_v) { env = atoi(envCstr); } else if constexpr (std::is_same_v) { env = (std::string(envCstr) != "0"); } else { env = std::string(envCstr); } } template void logEnv(const std::string &envName, const T &env) { if (!getenv(envName.c_str())) return; INFO(MSCCLPP_ENV, "%s=%d", envName.c_str(), env); } template <> void logEnv(const std::string &envName, const std::string &env) { if (!getenv(envName.c_str())) return; INFO(MSCCLPP_ENV, "%s=%s", envName.c_str(), env.c_str()); } namespace mscclpp { Env::Env() : debug(readEnv("MSCCLPP_DEBUG", "")), debugSubsys(readEnv("MSCCLPP_DEBUG_SUBSYS", "")), debugFile(readEnv("MSCCLPP_DEBUG_FILE", "")), hcaDevices(readEnv("MSCCLPP_HCA_DEVICES", "")), hostid(readEnv("MSCCLPP_HOSTID", "")), socketFamily(readEnv("MSCCLPP_SOCKET_FAMILY", "")), socketIfname(readEnv("MSCCLPP_SOCKET_IFNAME", "")), commId(readEnv("MSCCLPP_COMM_ID", "")), executionPlanDir(readEnv("MSCCLPP_EXECUTION_PLAN_DIR", "")), npkitDumpDir(readEnv("MSCCLPP_NPKIT_DUMP_DIR", "")), cudaIpcUseDefaultStream(readEnv("MSCCLPP_CUDAIPC_USE_DEFAULT_STREAM", false)), ncclSharedLibPath(readEnv("MSCCLPP_NCCL_LIB_PATH", "")), forceNcclFallbackOperation(readEnv("MSCCLPP_FORCE_NCCL_FALLBACK_OPERATION", "")), enableNcclFallback(readEnv("MSCCLPP_ENABLE_NCCL_FALLBACK", false)), disableChannelCache(readEnv("MSCCLPP_DISABLE_CHANNEL_CACHE", false)) {} std::shared_ptr env() { static std::shared_ptr globalEnv = std::shared_ptr(new Env()); static bool logged = false; if (!logged) { logged = true; // cannot log inside the constructor because of circular dependency logEnv("MSCCLPP_DEBUG", globalEnv->debug); logEnv("MSCCLPP_DEBUG_SUBSYS", globalEnv->debugSubsys); logEnv("MSCCLPP_DEBUG_FILE", globalEnv->debugFile); logEnv("MSCCLPP_HCA_DEVICES", globalEnv->hcaDevices); logEnv("MSCCLPP_HOSTID", globalEnv->hostid); logEnv("MSCCLPP_SOCKET_FAMILY", globalEnv->socketFamily); logEnv("MSCCLPP_SOCKET_IFNAME", globalEnv->socketIfname); logEnv("MSCCLPP_COMM_ID", globalEnv->commId); logEnv("MSCCLPP_EXECUTION_PLAN_DIR", globalEnv->executionPlanDir); logEnv("MSCCLPP_NPKIT_DUMP_DIR", globalEnv->npkitDumpDir); logEnv("MSCCLPP_CUDAIPC_USE_DEFAULT_STREAM", globalEnv->cudaIpcUseDefaultStream); logEnv("MSCCLPP_NCCL_LIB_PATH", globalEnv->ncclSharedLibPath); logEnv("MSCCLPP_FORCE_NCCL_FALLBACK_OPERATION", globalEnv->forceNcclFallbackOperation); logEnv("MSCCLPP_ENABLE_NCCL_FALLBACK", globalEnv->enableNcclFallback); logEnv("MSCCLPP_DISABLE_CHANNEL_CACHE", globalEnv->disableChannelCache); } return globalEnv; } } // namespace mscclpp