CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
311 lines
12 KiB
C++
311 lines
12 KiB
C++
// Copyright Advanced Micro Devices, Inc., or its affiliates.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#pragma once
|
|
|
|
#include <any>
|
|
#include <bitset>
|
|
#include <functional>
|
|
#include <limits>
|
|
#include <map>
|
|
#include <shared_mutex>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <rocRoller/Assemblers/Assembler_fwd.hpp>
|
|
#include <rocRoller/Scheduling/Costs/Cost_fwd.hpp>
|
|
#include <rocRoller/Scheduling/Scheduler_fwd.hpp>
|
|
#include <rocRoller/Utilities/Concepts.hpp>
|
|
#include <rocRoller/Utilities/LazySingleton.hpp>
|
|
#include <rocRoller/Utilities/Settings_fwd.hpp>
|
|
#include <rocRoller/Utilities/Utils.hpp>
|
|
|
|
namespace rocRoller
|
|
{
|
|
/**
|
|
* @brief Base class for SettingsOption.
|
|
*
|
|
* Keeps track of its instances, so do not create temporaries.
|
|
*/
|
|
struct SettingsOptionBase
|
|
{
|
|
std::string name;
|
|
std::string description;
|
|
|
|
SettingsOptionBase(std::string name, std::string description);
|
|
virtual std::string help() const;
|
|
virtual std::optional<std::any> getFromEnv() const = 0;
|
|
virtual std::any getDefault() const = 0;
|
|
virtual int getBitIndex() const = 0;
|
|
|
|
/**
|
|
* @brief Getter for instances.
|
|
*/
|
|
static std::vector<SettingsOptionBase const*> const& instances();
|
|
|
|
private:
|
|
inline static std::vector<SettingsOptionBase const*> m_instances;
|
|
};
|
|
|
|
/**
|
|
* @brief Options are represented by the SettingsOption struct.
|
|
*
|
|
* @tparam T type of underlying option.
|
|
*/
|
|
template <typename T, bool LazyValue = false>
|
|
struct SettingsOption : public SettingsOptionBase
|
|
{
|
|
using Type = T;
|
|
using DefaultValueType =
|
|
typename std::conditional<LazyValue, std::function<T(void)>, T>::type;
|
|
DefaultValueType defaultValue;
|
|
int bit;
|
|
|
|
SettingsOption(std::string name,
|
|
std::string description,
|
|
DefaultValueType defaultValue,
|
|
int bit);
|
|
|
|
std::string help() const override;
|
|
std::optional<std::any> getFromEnv() const override;
|
|
std::any getDefault() const override;
|
|
int getBitIndex() const override;
|
|
|
|
T getTypeValue(std::string const&) const;
|
|
T getValue() const;
|
|
};
|
|
|
|
std::string toString(LogLevel level);
|
|
std::ostream& operator<<(std::ostream&, LogLevel const&);
|
|
|
|
/**
|
|
* @brief Settings class is derived from lazy singleton class and handles options
|
|
* that are defined through environment variables or developer defined options.
|
|
*
|
|
* Getting a value requires a call to get(SettingsOption opt). When get() is called,
|
|
* we probe m_values which maps an option name to its corresponding value. If opt does
|
|
* not exist in m_values then we assign the value based on the following precedence order:
|
|
* 1. the corresponding env variable will be used. If no env variable is set then
|
|
* 2. the default value is used if the value is not otherwise obtained.
|
|
*
|
|
* A call to set(SettingsOption opt) sets (or overwrites) the corresponding value in m_values.
|
|
*/
|
|
class Settings : public LazySingleton<Settings>
|
|
{
|
|
public:
|
|
using bitFieldType = std::bitset<32>;
|
|
|
|
static inline const SettingsOption<bool> LogConsole{
|
|
"ROCROLLER_LOG_CONSOLE", "Log debug info to stdout/stderr", true, 0};
|
|
|
|
static inline const SettingsOption<bool> SaveAssembly{
|
|
"ROCROLLER_SAVE_ASSEMBLY",
|
|
"Assembly code written to text file in the current working directory as it is "
|
|
"generated",
|
|
false,
|
|
1};
|
|
|
|
static inline const SettingsOption<bool> BreakOnThrow{
|
|
"ROCROLLER_BREAK_ON_THROW", "Cause exceptions thrown to cause a segfault", false, 2};
|
|
|
|
static inline const SettingsOption<std::string> ROCMPath{
|
|
"ROCM_PATH", "Path where ROCM is installed", "/opt/rocm", -1};
|
|
|
|
static inline const SettingsOption<std::string> ArchitectureFile{
|
|
"ROCROLLER_ARCHITECTURE_FILE", "GPU Architecture file", "", -1};
|
|
|
|
static inline const SettingsOption<std::string> AssemblyFile{
|
|
"ROCROLLER_ASSEMBLY_FILE", "File name to write assembly", "", -1};
|
|
|
|
static inline const SettingsOption<std::string> LogFile{
|
|
"ROCROLLER_LOG_FILE", "Log file name", "", -1};
|
|
|
|
static inline const SettingsOption<Scheduling::SchedulerProcedure> Scheduler{
|
|
"ROCROLLER_SCHEDULER",
|
|
"Scheduler used when scheduling independent instruction streams.",
|
|
Scheduling::SchedulerProcedure::Priority,
|
|
-1};
|
|
|
|
static inline const SettingsOption<Scheduling::CostFunction> SchedulerCost{
|
|
"ROCROLLER_SCHEDULER_COST",
|
|
"Default cost function for schedulers.",
|
|
Scheduling::CostFunction::LinearWeighted,
|
|
-1};
|
|
|
|
static inline const SettingsOption<std::string> SchedulerWeights{
|
|
"ROCROLLER_SCHEDULER_WEIGHTS",
|
|
"Scheduler Weight (YAML) File for LinearWeighted cost function.",
|
|
"",
|
|
-1};
|
|
|
|
static inline const SettingsOption<LogLevel> LogLvl{
|
|
"ROCROLLER_LOG_LEVEL", "Log level", LogLevel::None, -1};
|
|
|
|
static inline const SettingsOption<LogLevel> LogFileLvl{
|
|
"ROCROLLER_LOG_FILE_LEVEL", "Log level for output to the log file", LogLevel::None, -1};
|
|
|
|
static inline const SettingsOption<LogLevel> LogConsoleLvl{
|
|
"ROCROLLER_LOG_CONSOLE_LEVEL",
|
|
"Log level for output to the console",
|
|
LogLevel::None,
|
|
-1};
|
|
|
|
static inline const SettingsOption<int> RandomSeed{"ROCROLLER_RANDOM_SEED",
|
|
"Seed used with RandomGenerator class",
|
|
std::numeric_limits<int>::min(),
|
|
-1};
|
|
|
|
static inline const SettingsOption<bool> KernelAnalysis{
|
|
"ROCROLLER_KERNEL_ANALYSIS",
|
|
"Whether to track and report register liveness.",
|
|
false,
|
|
-1};
|
|
|
|
static inline const SettingsOption<bool> NoRegisterLimits{
|
|
"ROCROLLER_IGNORE_OUT_OF_REGISTERS",
|
|
"Ignore register count limits for debugging purposes.",
|
|
false,
|
|
-1};
|
|
|
|
static inline const SettingsOption<bool> AllowUnknownInstructions{
|
|
"ROCROLLER_ALLOW_UNKNOWN_INSTRUCTIONS",
|
|
"Whether to allow arbitrary instructions.",
|
|
false,
|
|
-1};
|
|
|
|
static inline const SettingsOption<bool> EnforceGraphConstraints{
|
|
"ROCROLLER_ENFORCE_GRAPH_CONSTRAINTS",
|
|
"Whether to enforce kernel graph constraints. (Could negatively impact code gen "
|
|
"performance)",
|
|
false,
|
|
-1};
|
|
|
|
static inline const SettingsOption<bool> AuditControlTracers{
|
|
"ROCROLLER_AUDIT_CONTROL_TRACERS",
|
|
"Whether to audit predicted use of arguments and/or registers."
|
|
"Could impact code gen performance.",
|
|
false,
|
|
-1};
|
|
|
|
static inline const SettingsOption<bool> LogGraphs{
|
|
"ROCROLLER_LOG_GRAPHS", "Whether to log graphs after each lowering stage.", true, -1};
|
|
|
|
static inline const SettingsOption<bool> LogGraphMapperConnections{
|
|
"ROCROLLER_LOG_GRAPHS_WITH_MAPPER",
|
|
"Whether to include mapper connections in the per-stage graphs.",
|
|
false,
|
|
-1};
|
|
|
|
static inline const SettingsOption<AssemblerType> KernelAssembler{
|
|
"ROCROLLER_ASSEMBLER", "Which assembler method to use", AssemblerType::InProcess, -1};
|
|
|
|
static inline const SettingsOption<std::string> SubprocessAssemblerPath{
|
|
"ROCROLLER_DEBUG_ASSEMBLER_PATH", "Path to subprocess assembler", "", -1};
|
|
|
|
static inline const std::string BitfieldName = "ROCROLLER_DEBUG";
|
|
|
|
static inline const SettingsOption<F8Mode, /*LazyValue*/ true> F8ModeOption{
|
|
"ROCROLLER_SET_F8MODE",
|
|
"F8 mode that can be either NaNoo or OCP",
|
|
getDefaultF8ModeForCurrentHipDevice,
|
|
-1};
|
|
|
|
static inline const SettingsOption<bool> SerializeKernelGraph{
|
|
"ROCROLLER_SERIALIZE_KERNEL_GRAPH",
|
|
"Serialize kernel graph into assembly file",
|
|
false,
|
|
-1};
|
|
|
|
static inline const SettingsOption<bool, true> SerializeKernelGraphDOT{
|
|
"ROCROLLER_SERIALIZE_KERNEL_GRAPH_DOT",
|
|
"Serialize kernel graph DOT into assembly file",
|
|
getDefaultValueForKernelGraphDOTSerialization,
|
|
-1};
|
|
|
|
static inline const SettingsOption<std::size_t> GraphNodeLabelMaxLength{
|
|
"ROCROLLER_KGRAPH_NODE_LABEL_MAX_LENGTH",
|
|
"Maximum length of KernelGraph node expression when emitting DOT",
|
|
std::size_t{1000},
|
|
-1};
|
|
|
|
static inline const SettingsOption<int> GFX1250AsicRevisionId{
|
|
"ROCROLLER_GFX1250_ASIC_REVISION_ID",
|
|
"Asic revision id to use when targetting GFX1250",
|
|
1,
|
|
-1};
|
|
|
|
/**
|
|
* @brief Creates a help dialog for the environment variables with
|
|
* their names, default values and bit-offset (if it has one).
|
|
*/
|
|
std::string help() const;
|
|
|
|
Settings();
|
|
|
|
/**
|
|
* @brief Gets the value of a SettingsOption.
|
|
*
|
|
* Set values for SettingsOption are stored in m_values map,
|
|
* otherwise call getValue().
|
|
*
|
|
* @tparam Option A SettingsOption templated by its defaultValue type.
|
|
* @param opt The SettingsOption we are getting.
|
|
* @return A value of type Option::Type that opt is set to.
|
|
*/
|
|
template <typename Option>
|
|
typename Option::Type get(Option const& opt);
|
|
|
|
/**
|
|
* @brief Gets the default value of a SettingsOption.
|
|
*
|
|
* @tparam Option A SettingsOption templated by its defaultValue type.
|
|
* @param opt The SettingsOption we are getting.
|
|
* @return A value of type Option::Type is defaulted to.
|
|
*/
|
|
template <typename Option>
|
|
static typename Option::Type getDefault(Option const& opt);
|
|
|
|
/**
|
|
* Static convenience function to get a settings value.
|
|
*/
|
|
template <typename Option>
|
|
static typename Option::Type Get(Option const& opt);
|
|
|
|
/**
|
|
* @brief Set the value of a SettingsOption.
|
|
*
|
|
* Set the value of a SettingsOption.
|
|
* Mismatching Option::Type and value type throws an error.
|
|
*
|
|
* @tparam Option A SettingsOption templated by its defaultValue type.
|
|
* @tparam T The type of val.
|
|
* @param opt The SettingsOption we are assigning val to.
|
|
* @param val The value we are trying to assign to opt.
|
|
*/
|
|
template <typename Option, typename T>
|
|
void set(Option const& opt, T const& val);
|
|
|
|
/**
|
|
* @brief Alias function to convert char* to std::string
|
|
*
|
|
* @tparam Option
|
|
* @param opt
|
|
* @param val
|
|
*/
|
|
template <typename Option>
|
|
inline void set(Option const& opt, char const* val);
|
|
|
|
private:
|
|
friend rocRoller::LazySingleton<Settings>;
|
|
|
|
using MapReaderLock = std::shared_lock<std::shared_mutex>;
|
|
using MapWriterLock = std::unique_lock<std::shared_mutex>;
|
|
|
|
std::shared_mutex m_mapLock;
|
|
std::map<std::string, std::any> m_values;
|
|
std::vector<std::string> m_setBitOptions;
|
|
};
|
|
}
|
|
|
|
#include <rocRoller/Utilities/Settings_impl.hpp>
|