8#if defined(__INTELLISENSE__) && !defined(OPENNN_HAS_CUDA)
12#ifndef EIGEN_USE_THREADS
13#define EIGEN_USE_THREADS
15#ifndef EIGEN_MAX_ALIGN_BYTES
16#define EIGEN_MAX_ALIGN_BYTES 64
24#define _SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING
25#define _CRT_SECURE_NO_WARNINGS
26#define EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS
27#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
50#include <source_location>
57#include <unordered_map>
58#include <unordered_set>
63#include <unsupported/Eigen/CXX11/Tensor>
68#include <cuda_runtime.h>
78 source_location loc = source_location::current())
81 throw runtime_error(
string(msg) +
" Error: " + to_string(
static_cast<int>(status)) +
82 " in " + loc.file_name() +
":" + to_string(loc.line()));
85#define CHECK_CUDA(x) check_cuda_status(x, "CUDA")
86#define CHECK_CUBLAS(x) check_cuda_status(x, "CuBLAS")
87#define CHECK_CUDNN(x) check_cuda_status(x, "cuDNN")
91using cudaStream_t =
void*;
92using cudaEvent_t =
void*;
93using cudaGraph_t =
void*;
94using cudaGraphExec_t =
void*;
95using cublasHandle_t =
void*;
96using cublasLtHandle_t =
void*;
97using cudnnHandle_t =
void*;
98using cublasLtMatmulDesc_t =
void*;
99using cublasLtMatrixLayout_t =
void*;
100struct cublasLtMatmulAlgo_t {};
102struct __nv_bfloat16 {
unsigned short __x; };
103struct __half {
unsigned short __x; };
105enum cudaDataType_t { CUDA_R_32F = 0, CUDA_R_16F = 2, CUDA_R_8I = 3, CUDA_R_32I = 10, CUDA_R_16BF = 14 };
106enum cublasComputeType_t { CUBLAS_COMPUTE_32F = 68, CUBLAS_COMPUTE_32F_FAST_16BF = 75, CUBLAS_COMPUTE_32F_FAST_TF32 = 77 };
107enum cublasOperation_t { CUBLAS_OP_N = 0, CUBLAS_OP_T = 1 };
108enum cublasLtEpilogue_t { CUBLASLT_EPILOGUE_DEFAULT = 1, CUBLASLT_EPILOGUE_RELU = 2, CUBLASLT_EPILOGUE_BIAS = 4, CUBLASLT_EPILOGUE_RELU_BIAS = 6, CUBLASLT_EPILOGUE_RELU_AUX_BIAS = 134, CUBLASLT_EPILOGUE_DRELU = 136, CUBLASLT_EPILOGUE_GELU_AUX_BIAS = 164 };
110enum cudnnDataType_t { CUDNN_DATA_FLOAT = 0, CUDNN_DATA_HALF = 2, CUDNN_DATA_INT8 = 3, CUDNN_DATA_INT32 = 4, CUDNN_DATA_BFLOAT16 = 9 };
112struct cudnnTensorStruct {};
113using cudnnTensorDescriptor_t = cudnnTensorStruct*;
114struct cudnnPoolingStruct {};
115using cudnnPoolingDescriptor_t = cudnnPoolingStruct*;
116using cudnnDropoutDescriptor_t =
void*;
117using cudnnOpTensorDescriptor_t =
void*;
118using cudnnRNNDescriptor_t =
void*;
119using cudnnRNNDataDescriptor_t =
void*;
123#define OPENNN_CUDA_STUB_BODY(name) { throw runtime_error(#name " requires CUDA support."); }
124#define OPENNN_CUDA_STUB(ret, name, sig) static ret name sig OPENNN_CUDA_STUB_BODY(name)
126#define OPENNN_CUDA_TEMPLATE_STUB(name) template<typename... Ts, typename... As> static void name(As&&...) OPENNN_CUDA_STUB_BODY(name)
144#ifdef OPENNN_HAS_CUDA
154#ifdef OPENNN_HAS_CUDA
160#ifdef OPENNN_HAS_CUDA
170using namespace Eigen;
175 return bit_cast<float>(uint32_t(value) << 16);
180 uint32_t bits = bit_cast<uint32_t>(value);
181 if ((bits & 0x7FFFFFFFu) > 0x7F800000u)
182 return uint16_t((bits >> 16) | 0x0040u);
184 bits += 0x7FFFu + ((bits >> 16) & 1u);
185 return uint16_t(bits >> 16);
190 uint16_t* destination)
192 #pragma omp parallel for if(count > 4096)
193 for (Index i = 0; i < count; ++i)
206#if defined(__CUDA_ARCH__)
208template<
typename Message,
typename... Args>
209[[noreturn]] __device__
inline void throw_formatted(Message&&, Args&&...)
217 const source_location& loc = source_location::current())
222 const string_view file = loc.file_name();
223 const size_t separator = file.find_last_of(
"/\\");
225 throw runtime_error(format(
"{} [at {}:{}]",
227 separator == string_view::npos
229 : file.substr(separator + 1),
233template<
typename... Args>
234[[noreturn]]
inline void throw_formatted(format_string<Args...> message, Args&&... args)
236 throw runtime_error(format(message, std::forward<Args>(args)...));
243#define throw_if(condition, ...) do { if (condition) ::opennn::detail::throw_formatted(__VA_ARGS__); } while (false)
248template<
typename Map>
251 throw_if(capacity == 0,
"A bounded cache requires a positive capacity.");
253 if (entries.size() >= capacity)
254 entries.erase(entries.begin());
257template<
typename Map,
typename Key>
260 const size_t capacity)
262 if (
const auto found = entries.find(key); found != entries.end())
263 return found->second;
267 return entries.try_emplace(key).first->second;
272template <
typename T,
typename... Candidates>
273constexpr bool is_one_of(
const T& value,
const Candidates&... candidates)
275 return ((value == candidates) || ...);
284 : cleanup(std::move(new_cleanup))
308constexpr float EPSILON = numeric_limits<float>::epsilon();
309constexpr float MAX = numeric_limits<float>::max();
312constexpr float QUIET_NAN = numeric_limits<float>::quiet_NaN();
319 for (
size_t i = 0; i < vec.size(); ++i)
322 if (i + 1 < vec.size()) os <<
"; ";
331using MatrixR = Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Layout>;
332using MatrixI = Eigen::Matrix<Index, Eigen::Dynamic, Eigen::Dynamic, Layout>;
333using MatrixB = Eigen::Matrix<bool, Eigen::Dynamic, Eigen::Dynamic, Layout>;
335using VectorR = Eigen::Matrix<float, Eigen::Dynamic, 1>;
336using VectorI = Eigen::Matrix<Index, Eigen::Dynamic, 1>;
337using VectorB = Eigen::Matrix<bool, Eigen::Dynamic, 1>;
339using VectorMap = Eigen::Map<VectorR, Eigen::AlignedMax>;
342using MatrixMap = Eigen::Map<MatrixR, Eigen::AlignedMax>;
349using Tensor0 = Eigen::Tensor<float, 0, Layout | Eigen::AlignedMax>;
350using Tensor1 = Eigen::Tensor<float, 1, Layout | Eigen::AlignedMax>;
351using Tensor2 = Eigen::Tensor<float, 2, Layout | Eigen::AlignedMax>;
352using Tensor3 = Eigen::Tensor<float, 3, Layout | Eigen::AlignedMax>;
353using Tensor4 = Eigen::Tensor<float, 4, Layout | Eigen::AlignedMax>;
356using TensorR = Eigen::Tensor<float, Rank, Layout | Eigen::AlignedMax>;
358using TensorMap3 = Eigen::TensorMap<Eigen::Tensor<float, 3, Layout | Eigen::AlignedMax>, Eigen::AlignedMax>;
359using TensorMap4 = Eigen::TensorMap<Eigen::Tensor<float, 4, Layout | Eigen::AlignedMax>, Eigen::AlignedMax>;
362using TensorMapR = Eigen::TensorMap<Eigen::Tensor<float, Rank, Layout | Eigen::AlignedMax>, Eigen::AlignedMax>;
Definition opennn_types.h:280
ScopeExit & operator=(const ScopeExit &)=delete
~ScopeExit() noexcept
Definition opennn_types.h:288
ScopeExit(F new_cleanup)
Definition opennn_types.h:283
void release() noexcept
Definition opennn_types.h:298
ScopeExit(const ScopeExit &)=delete
Definition opennn_types.h:204
Map::mapped_type & bounded_cache_entry(Map &entries, const Key &key, const size_t capacity)
Definition opennn_types.h:258
void throw_formatted(string_view message, const source_location &loc=source_location::current())
Definition opennn_types.h:216
void make_bounded_cache_room(Map &entries, const size_t capacity)
Definition opennn_types.h:249
Definition configuration.h:10
constexpr float POS_INFINITY
Definition opennn_types.h:310
cudaDataType_t DeviceDataType
Definition opennn_types.h:168
@ Eigen
Definition configuration.h:37
constexpr float MAX
Definition opennn_types.h:309
constexpr float NEG_INFINITY
Definition opennn_types.h:311
cudaGraph_t DeviceGraph
Definition opennn_types.h:137
cudnnRNNDataDescriptor_t DnnRNNDataDescriptor
Definition opennn_types.h:150
constexpr float EPSILON
Definition opennn_types.h:308
cudaGraphExec_t DeviceGraphExec
Definition opennn_types.h:138
cublasLtHandle_t BlasLtHandle
Definition opennn_types.h:140
cudnnTensorDescriptor_t DnnTensorDescriptor
Definition opennn_types.h:149
cudnnRNNMode_t DnnRNNMode
Definition opennn_types.h:155
constexpr float SOFTMAX_MASK_VALUE
Definition opennn_types.h:313
cudnnPoolingDescriptor_t DnnPoolingDescriptor
Definition opennn_types.h:153
cudnnStatus_t DnnStatus
Definition opennn_types.h:145
cudnnHandle_t DnnHandle
Definition opennn_types.h:141
cudnnOpTensorDescriptor_t DnnOpTensorDescriptor
Definition opennn_types.h:142
constexpr bool is_one_of(const T &value, const Candidates &... candidates)
Definition opennn_types.h:273
constexpr float QUIET_NAN
Definition opennn_types.h:312
cudnnDropoutDescriptor_t DnnDropoutDescriptor
Definition opennn_types.h:152
cudnnRNNDescriptor_t DnnRNNDescriptor
Definition opennn_types.h:151
ostream & operator<<(ostream &os, const vector< T > &vec)
Definition opennn_types.h:316
cudnnDataType_t DnnDataType
Definition opennn_types.h:143
ScopeExit(F) -> ScopeExit< F >
cudaEvent_t DeviceEvent
Definition opennn_types.h:136
cublasComputeType_t BlasComputeType
Definition opennn_types.h:159
uint16_t float_to_bfloat16_host(const float value)
Definition opennn_types.h:178
cublasMath_t BlasMathMode
Definition opennn_types.h:162
cudaStream_t DeviceStream
Definition opennn_types.h:135
cublasHandle_t BlasHandle
Definition opennn_types.h:139
float bfloat16_to_float_host(const uint16_t value)
Definition opennn_types.h:173
cublasOperation_t BlasOperation
Definition opennn_types.h:167
void float_2_bfloat16_host(const Index count, const float *source, uint16_t *destination)
Definition opennn_types.h:188
__nv_bfloat16 bfloat16
Definition opennn_types.h:171
float type
Definition opennn_types.h:197
cublasPointerMode_t BlasPointerMode
Definition opennn_types.h:161
float type
Definition opennn_types.h:131
ConstUnalignedVectorMap as_vector_map(const span< const float > values)
Definition opennn_types.h:344
Eigen::Matrix< float, Eigen::Dynamic, 1 > VectorR
Definition opennn_types.h:335
Eigen::TensorMap< Eigen::Tensor< float, 4, Layout|Eigen::AlignedMax >, Eigen::AlignedMax > TensorMap4
Definition opennn_types.h:359
Eigen::TensorMap< Eigen::Tensor< float, Rank, Layout|Eigen::AlignedMax >, Eigen::AlignedMax > TensorMapR
Definition opennn_types.h:362
Eigen::Matrix< float, Eigen::Dynamic, Eigen::Dynamic, Layout > MatrixR
Definition opennn_types.h:331
Eigen::Map< const VectorR, Eigen::AlignedMax > ConstVectorMap
Definition opennn_types.h:340
Eigen::Map< VectorR, Eigen::AlignedMax > VectorMap
Definition opennn_types.h:339
Eigen::Matrix< Index, Eigen::Dynamic, Eigen::Dynamic, Layout > MatrixI
Definition opennn_types.h:332
Eigen::Tensor< float, 3, Layout|Eigen::AlignedMax > Tensor3
Definition opennn_types.h:352
Eigen::Tensor< float, 4, Layout|Eigen::AlignedMax > Tensor4
Definition opennn_types.h:353
Eigen::Matrix< bool, Eigen::Dynamic, 1 > VectorB
Definition opennn_types.h:337
void check_cuda_status(T status, const char *msg, source_location loc=source_location::current())
Definition opennn_types.h:77
Eigen::Matrix< Index, Eigen::Dynamic, 1 > VectorI
Definition opennn_types.h:336
Eigen::Tensor< float, 2, Layout|Eigen::AlignedMax > Tensor2
Definition opennn_types.h:351
Eigen::Tensor< float, 0, Layout|Eigen::AlignedMax > Tensor0
Definition opennn_types.h:349
#define throw_if(condition,...)
Definition opennn_types.h:243
Eigen::Map< const VectorR > ConstUnalignedVectorMap
Definition opennn_types.h:341
Eigen::TensorMap< Eigen::Tensor< float, 3, Layout|Eigen::AlignedMax >, Eigen::AlignedMax > TensorMap3
Definition opennn_types.h:358
Eigen::Tensor< float, Rank, Layout|Eigen::AlignedMax > TensorR
Definition opennn_types.h:356
Eigen::Map< MatrixR, Eigen::AlignedMax > MatrixMap
Definition opennn_types.h:342
Eigen::Matrix< bool, Eigen::Dynamic, Eigen::Dynamic, Layout > MatrixB
Definition opennn_types.h:333
constexpr int Layout
Definition opennn_types.h:329
Eigen::Tensor< float, 1, Layout|Eigen::AlignedMax > Tensor1
Definition opennn_types.h:350