#ifndef CAFFE_CUDNN_POOLING_LAYER_HPP_ #define CAFFE_CUDNN_POOLING_LAYER_HPP_ #include #include "caffe/blob.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/layers/pooling_layer.hpp" namespace caffe { #ifdef USE_CUDNN /* * @brief cuDNN implementation of PoolingLayer. * Fallback to PoolingLayer for CPU mode. */ template class CuDNNPoolingLayer : public PoolingLayer { public: explicit CuDNNPoolingLayer(const LayerParameter& param) : PoolingLayer(param), handles_setup_(false) {} virtual void LayerSetUp(const vector*>& bottom, const vector*>& top); virtual void Reshape(const vector*>& bottom, const vector*>& top); virtual ~CuDNNPoolingLayer(); // Currently, cuDNN does not support the extra top blob. virtual inline int MinTopBlobs() const { return -1; } virtual inline int ExactNumTopBlobs() const { return 1; } 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_; cudnnTensorDescriptor_t bottom_desc_, top_desc_; cudnnPoolingDescriptor_t pooling_desc_; cudnnPoolingMode_t mode_; }; #endif } // namespace caffe #endif // CAFFE_CUDNN_POOLING_LAYER_HPP_