My Project
network_wrapper.hpp
Go to the documentation of this file.
1 #pragma once
2 
8 #include "layer.hpp" // CPU layer tags
9 #include "network.hpp" // CPU implementation
10 
11 #ifdef __CUDACC__
12  #include "cuda/kernels.cuh" // CUDA Enums
13  #include "cuda/network.cuh" // GPU Implementation
14 #endif
15 
16 #include <iostream>
17 #include <memory>
18 
20 struct CpuBackend {};
22 struct CudaBackend {};
23 
28 template <typename T> struct ActivationToEnum;
29 
31 template <> struct ActivationToEnum<cpu_mlp::Linear> {
32 #ifdef __CUDACC__
34 #endif
35 };
37 template <> struct ActivationToEnum<cpu_mlp::Sigmoid> {
38 #ifdef __CUDACC__
40 #endif
41 };
43 template <> struct ActivationToEnum<cpu_mlp::Tanh> {
44 #ifdef __CUDACC__
46 #endif
47 };
49 template <> struct ActivationToEnum<cpu_mlp::ReLU> {
50 #ifdef __CUDACC__
52 #endif
53 };
54 
55 template <typename Backend> class NetworkWrapper;
56 
60 template <> class NetworkWrapper<CpuBackend> {
61 public:
63 
64  NetworkWrapper() = default;
65 
66  template <int In, int Out, typename Activation> void addLayer() { network_.addLayer<In, Out, Activation>(); }
67 
68  void bindParams() { network_.bindParams(); }
69  void bindParams(unsigned int seed) { network_.bindParams(seed); }
70 
72  InternalNetwork &getInternal() { return network_; }
74  const InternalNetwork &getInternal() const { return network_; }
75 
77  size_t getParamsSize() const { return network_.getSize(); }
78 
79 private:
80  InternalNetwork network_;
81 };
82 
86 #ifdef __CUDACC__
87 template <> class NetworkWrapper<CudaBackend> {
88 public:
89  using InternalNetwork = cuda_mlp::CudaNetwork;
90 
91  explicit NetworkWrapper(cuda_mlp::CublasHandle &handle) : network_(handle) {}
92 
93  template <int In, int Out, typename Activation> void addLayer() {
94  network_.addLayer(In, Out, ActivationToEnum<Activation>::value);
95  }
96 
97  void bindParams() { network_.bindParams(); }
98  void bindParams(unsigned int seed) { network_.bindParams(seed); }
99 
101  InternalNetwork &getInternal() { return network_; }
103  const InternalNetwork &getInternal() const { return network_; }
104 
106  size_t getParamsSize() const { return network_.params_size(); }
107 
108 private:
109  InternalNetwork network_;
110 };
111 #endif
void bindParams()
Definition: network_wrapper.hpp:68
size_t getParamsSize() const
Total number of parameters.
Definition: network_wrapper.hpp:77
void bindParams(unsigned int seed)
Definition: network_wrapper.hpp:69
void addLayer()
Definition: network_wrapper.hpp:66
InternalNetwork & getInternal()
Access the underlying CPU network.
Definition: network_wrapper.hpp:72
const InternalNetwork & getInternal() const
Access the underlying CPU network (const).
Definition: network_wrapper.hpp:74
Definition: network_wrapper.hpp:55
Simple feedforward network with contiguous parameter storage.
Definition: network.hpp:21
RAII-managed cuBLAS handle.
Definition: cublas_handle.cuh:22
Feed-forward dense network with GPU-backed parameters and gradients.
Definition: network.cuh:16
Layer interfaces and dense layer implementation for CPU.
Definition: layer.hpp:13
ActivationType
Supported activation functions.
Definition: kernels.cuh:53
Feedforward network composed of dense layers.
Map CPU activation tags to CUDA activation enums.
Definition: network_wrapper.hpp:28
Backend tag for CPU implementations.
Definition: network_wrapper.hpp:20
Backend tag for CUDA implementations.
Definition: network_wrapper.hpp:22
Linear activation.
Definition: pinn_network.hpp:29
Tanh activation.
Definition: pinn_network.hpp:24