OpenNN
Open-source neural networks library
Loading...
Searching...
No Matches
configuration.h
Go to the documentation of this file.
1// OpenNN: Open Neural Networks Library
2// www.opennn.net
3//
4// C O N F I G U R A T I O N
5//
6// Artificial Intelligence Techniques SL
7// artelnics@artelnics.com
8
9#pragma once
10
11#include "pch.h"
12
13namespace opennn
14{
15
17enum class Device { Auto, CPU, CUDA };
18
20enum class Type { Auto, FP32, BF16, INT8 };
21
23template<Type T> struct TypeInfo;
24
26template<> struct TypeInfo<Type::FP32>
27{
28 using type = float;
30 static constexpr cudaDataType_t cuda = CUDA_R_32F;
31 static constexpr Index bytes = Index(sizeof(float));
32 static constexpr const char* name = "FP32";
33};
34
36template<> struct TypeInfo<Type::BF16>
37{
38 using type = bfloat16;
40 static constexpr cudaDataType_t cuda = CUDA_R_16BF;
41 static constexpr Index bytes = Index(sizeof(bfloat16));
42 static constexpr const char* name = "BF16";
43};
44
46template<> struct TypeInfo<Type::INT8>
47{
48 using type = int8_t;
50 static constexpr cudaDataType_t cuda = CUDA_R_8I;
51 static constexpr Index bytes = Index(1);
52 static constexpr const char* name = "INT8";
53};
54
58template<Type... Supported, typename F>
59void visit_type(Type t, F&& f)
60{
61 bool matched = false;
62 ((t == Supported && (f(TypeInfo<Supported>{}), matched = true, false)) || ...);
63 throw_if(!matched, "visit_type: unsupported Type value");
64}
65
70template<Type... Supported, typename F>
71void visit_type_pair(Type t_in, Type t_out, F&& f)
72{
73 visit_type<Supported...>(t_in, [&](auto in_info)
74 {
75 visit_type<Supported...>(t_out, [&](auto out_info)
76 {
77 f(in_info, out_info);
78 });
79 });
80}
81
83[[nodiscard]] inline cudnnDataType_t to_cudnn(Type type) noexcept
84{
85 using enum Type;
86 switch (type)
87 {
88 case Auto: return TypeInfo<FP32>::cudnn;
89 case FP32: return TypeInfo<FP32>::cudnn;
90 case BF16: return TypeInfo<BF16>::cudnn;
91 case INT8: return TypeInfo<INT8>::cudnn;
92 }
94}
95
97[[nodiscard]] inline cudaDataType_t to_cuda(Type type) noexcept
98{
99 using enum Type;
100 switch (type)
101 {
102 case Auto: return TypeInfo<FP32>::cuda;
103 case FP32: return TypeInfo<FP32>::cuda;
104 case BF16: return TypeInfo<BF16>::cuda;
105 case INT8: return TypeInfo<INT8>::cuda;
106 }
108}
109
111[[nodiscard]] inline Index type_bytes(Type type) noexcept
112{
113 using enum Type;
114 switch (type)
115 {
116 case Auto: return TypeInfo<FP32>::bytes;
117 case FP32: return TypeInfo<FP32>::bytes;
118 case BF16: return TypeInfo<BF16>::bytes;
119 case INT8: return TypeInfo<INT8>::bytes;
120 }
122}
123
125class Configuration
126{
127public:
128
136
138 [[nodiscard]] static Configuration& instance()
139 {
140 static Configuration configuration;
141 return configuration;
142 }
143
148 void set(Device new_device = Device::Auto,
149 Type new_training_type = Type::Auto,
150 Type new_inference_type = Type::Auto);
151
152 [[nodiscard]] Device get_device() const { return device; }
153 [[nodiscard]] Type get_training_type() const { return training_type; }
154 [[nodiscard]] Type get_inference_type() const { return inference_type; }
155
157 [[nodiscard]] const Resolved& resolve() const
158 {
159 if (cache_valid)
160 return cached_resolved;
161
162 return resolve_slow();
163 }
164
165 [[nodiscard]] bool is_gpu() const { return resolve().device == Device::CUDA; }
166 [[nodiscard]] bool is_cpu() const { return resolve().device == Device::CPU; }
167
168 [[nodiscard]] bool is_bf16_training() const { return resolve().training_type == Type::BF16; }
169 [[nodiscard]] bool is_bf16_inference() const { return resolve().inference_type == Type::BF16; }
170
171private:
172
173 Configuration() = default;
174
175 [[nodiscard]] const Resolved& resolve_slow() const;
176
177 Device device = Device::Auto;
178 Type training_type = Type::Auto;
179 Type inference_type = Type::Auto;
180
181 mutable Resolved cached_resolved;
182 mutable atomic<bool> cache_valid{false};
183};
184
186[[nodiscard]] inline bool is_gpu() { return Configuration::instance().is_gpu(); }
188[[nodiscard]] inline bool is_cpu() { return Configuration::instance().is_cpu(); }
190[[nodiscard]] inline bool is_bf16_training() { return Configuration::instance().is_bf16_training(); }
192[[nodiscard]] inline bool is_bf16_inference() { return Configuration::instance().is_bf16_inference(); }
194[[nodiscard]] inline Device current_device() { return is_gpu() ? Device::CUDA : Device::CPU; }
195
196}
197
198// OpenNN: Open Neural Networks Library.
199// Copyright(C) 2005-2026 Artificial Intelligence Techniques, SL.
200// Licensed under the GNU Lesser General Public License v2.1 or later.
Global singleton holding the OpenNN device and precision configuration.
Definition configuration.h:126
const Resolved & resolve() const
Returns the cached resolved configuration, computing it on first access.
Definition configuration.h:157
bool is_cpu() const
Definition configuration.h:166
Device get_device() const
Definition configuration.h:152
Type get_training_type() const
Definition configuration.h:153
bool is_bf16_inference() const
Definition configuration.h:169
bool is_bf16_training() const
Definition configuration.h:168
bool is_gpu() const
Definition configuration.h:165
Type get_inference_type() const
Definition configuration.h:154
static Configuration & instance()
Returns the process-wide Configuration singleton.
Definition configuration.h:138
void set(Device new_device=Device::Auto, Type new_training_type=Type::Auto, Type new_inference_type=Type::Auto)
Updates device and precision settings; subsequent resolve() calls reflect the change.
Definition adaptive_moment_estimation.h:14
bool is_cpu()
Returns true when the resolved configuration runs on CPU.
Definition configuration.h:188
Device current_device()
Returns the active runtime device (CUDA if available, otherwise CPU).
Definition configuration.h:194
Index type_bytes(Type type) noexcept
Returns the byte size of one element of the given OpenNN Type.
Definition configuration.h:111
bool is_bf16_inference()
Returns true when inference is configured to use BF16 precision.
Definition configuration.h:192
Device
Execution device selection for OpenNN runtime (auto-detected, CPU or CUDA GPU).
Definition configuration.h:17
@ Auto
Definition configuration.h:17
@ CPU
Definition configuration.h:17
@ CUDA
Definition configuration.h:17
void throw_if(bool condition, const string &message, const source_location &loc=source_location::current())
Definition pch.h:147
bool is_gpu()
Returns true when the resolved configuration runs on a CUDA GPU.
Definition configuration.h:186
cudnnDataType_t to_cudnn(Type type) noexcept
Returns the cuDNN data type matching the given OpenNN Type (Auto resolves to FP32).
Definition configuration.h:83
Type
Numeric precision used for training or inference tensors.
Definition configuration.h:20
@ Auto
Definition configuration.h:20
@ FP32
Definition configuration.h:20
@ INT8
Definition configuration.h:20
@ BF16
Definition configuration.h:20
void visit_type(Type t, F &&f)
Dispatches f with the TypeInfo of the runtime Type t (must be in Supported).
Definition configuration.h:59
cudaDataType_t to_cuda(Type type) noexcept
Returns the CUDA data type matching the given OpenNN Type (Auto resolves to FP32).
Definition configuration.h:97
bool is_bf16_training()
Returns true when training is configured to use BF16 precision.
Definition configuration.h:190
void visit_type_pair(Type t_in, Type t_out, F &&f)
Dispatches f with the TypeInfo pair for an input and output runtime Type.
Definition configuration.h:71
__nv_bfloat16 bfloat16
Definition pch.h:145
cudaDataType_t
Definition pch.h:93
@ CUDA_R_32F
Definition pch.h:93
@ CUDA_R_8I
Definition pch.h:93
@ CUDA_R_16BF
Definition pch.h:93
cudnnDataType_t
Definition pch.h:99
@ CUDNN_DATA_BFLOAT16
Definition pch.h:99
@ CUDNN_DATA_INT8
Definition pch.h:99
@ CUDNN_DATA_FLOAT
Definition pch.h:99
Resolved configuration after Auto values are mapped to concrete device and types.
Definition configuration.h:131
Type training_type
Definition configuration.h:133
Type inference_type
Definition configuration.h:134
Device device
Definition configuration.h:132
bfloat16 type
Definition configuration.h:38
static constexpr Index bytes
Definition configuration.h:41
static constexpr cudaDataType_t cuda
Definition configuration.h:40
static constexpr cudnnDataType_t cudnn
Definition configuration.h:39
static constexpr const char * name
Definition configuration.h:42
float type
Definition configuration.h:28
static constexpr Index bytes
Definition configuration.h:31
static constexpr cudnnDataType_t cudnn
Definition configuration.h:29
static constexpr const char * name
Definition configuration.h:32
static constexpr cudaDataType_t cuda
Definition configuration.h:30
static constexpr cudaDataType_t cuda
Definition configuration.h:50
int8_t type
Definition configuration.h:48
static constexpr cudnnDataType_t cudnn
Definition configuration.h:49
static constexpr const char * name
Definition configuration.h:52
static constexpr Index bytes
Definition configuration.h:51
Compile-time traits mapping an opennn::Type to its underlying numeric type and library identifiers.
Definition configuration.h:23