#ifndef CAFFE_CUDNN_LCN_LAYER_HPP_ #define CAFFE_CUDNN_LCN_LAYER_HPP_ #include #include "caffe/blob.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/layers/lrn_layer.hpp" #include "caffe/layers/power_layer.hpp" namespace caffe { #ifdef USE_CUDNN template class CuDNNLCNLayer : public LRNLayer { public: explicit CuDNNLCNLayer(const LayerParameter& param) : LRNLayer(param), handles_setup_(false), tempDataSize(0), tempData1(NULL), tempData2(NULL) {} virtual void LayerSetUp(const vector*>& bottom, const vector*>& top); virtual void Reshape(const vector*>& bottom, const vector*>& top); virtual ~CuDNNLCNLayer(); protected: virtual void Forward_gpu(const vector*>& bottom, const vector*>& top); virtual void Backward_gpu(const vector*>& top, const vector& propagate_down, const vector*>& bottom); bool handles_setup_; cudnnHandle_t handle_; cudnnLRNDescriptor_t norm_desc_; cudnnTensorDescriptor_t bottom_desc_, top_desc_; int size_, pre_pad_; Dtype alpha_, beta_, k_; size_t tempDataSize; void *tempData1, *tempData2; }; #endif } // namespace caffe #endif // CAFFE_CUDNN_LCN_LAYER_HPP_