diff --git a/CMakeLists.txt b/CMakeLists.txt index 028d451..4ae412d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,6 @@ if(CUDAToolkit_FOUND) option(USE_CUDA "Use CUDA implementation" ON) else() option(USE_CUDA "Use CUDA implementation" OFF) - message(STATUS "CUDA not found. Defaulting to CPU implementation.") endif() if(USE_CUDA) @@ -19,7 +18,7 @@ if(USE_CUDA) add_definitions(-DUSE_CUDA) message(STATUS "Building library with CUDA support") else() - message(STATUS "Building library without CUDA support") + message(STATUS "CUDA not found or disabled. Defaulting to CPU implementation.") endif() diff --git a/include/layers/activation.cuh b/include/layers/activation.hpp similarity index 87% rename from include/layers/activation.cuh rename to include/layers/activation.hpp index 0496f7b..5c8f28b 100644 --- a/include/layers/activation.cuh +++ b/include/layers/activation.hpp @@ -47,11 +47,21 @@ class Activation { private: ActivationType activationType; int length; + +#ifdef USE_CUDA int gridSize; float* d_softmax_sum; float* d_max; + void activateCUDA(float* d_input); + + void initCUDA(); + void delCUDA(); +#else + void activateCPU(float* input); +#endif + }; diff --git a/src/layers/activation.cu b/src/backends/cuda/layers/activation.cu similarity index 89% rename from src/layers/activation.cu rename to src/backends/cuda/layers/activation.cu index 6d14e78..9b9dbca 100644 --- a/src/layers/activation.cu +++ b/src/backends/cuda/layers/activation.cu @@ -1,7 +1,6 @@ -#include #include -#include "activation.cuh" +#include "activation.hpp" #include "activation_functions.cuh" #include "cuda_helper.cuh" #include "matmul.cuh" @@ -9,8 +8,7 @@ using namespace CUDANet::Layers; -Activation::Activation(ActivationType activation, const int length) - : activationType(activation), length(length) { +void Activation::initCUDA() { if (activationType == SOFTMAX) { d_softmax_sum = nullptr; CUDA_CHECK(cudaMalloc((void**)&d_softmax_sum, sizeof(float) * length)); @@ -22,14 +20,14 @@ Activation::Activation(ActivationType activation, const int length) gridSize = (length + BLOCK_SIZE - 1) / BLOCK_SIZE; } -Activation::~Activation() { +void Activation::delCUDA() { if (activationType == SOFTMAX) { CUDA_CHECK(cudaFree(d_softmax_sum)); CUDA_CHECK(cudaFree(d_max)); } } -void Activation::activate(float* d_input) { +void Activation::activateCUDA(float* d_input) { // float sum = 0.0f; diff --git a/src/layers/activation.cpp b/src/layers/activation.cpp new file mode 100644 index 0000000..08a864d --- /dev/null +++ b/src/layers/activation.cpp @@ -0,0 +1,31 @@ +#include +#include + +#include "activation.hpp" + +using namespace CUDANet::Layers; + +Activation::Activation(ActivationType activation, const int length) + : activationType(activation), length(length) { +#ifdef USE_CUDA + initCUDA(); +#endif +} + +Activation::~Activation() { +#ifdef USE_CUDA + delCUDA(); +#endif +} + +void Activation::activateCPU(float* input) { + throw std::logic_error("Not implemented"); +} + +void Activation::activate(float* input) { +#ifdef USE_CUDA + activateCUDA(input); +#else + activateCPU(input); +#endif +} \ No newline at end of file