[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/2php/CaffeOnACL/master/src/caffe/layers/acl_pooling_layer.cpp [Back]  [Original]

#ifdef USE_ACL
#include 

#include "caffe/layers/acl_pooling_layer.hpp"

namespace caffe {

template 
void ACLPoolingLayer::LayerSetUp(const vector& bottom,
    const vector& top) {
  PoolingLayer::LayerSetUp(bottom, top);
  this->force_bypass_acl_path_= bypass_acl_class_layer & FLAGS_ENABLE_ACL_POOLING;
}
template 
void ACLPoolingLayer::SetupACLLayer(const vector& bottom,
      const vector& top){

    TensorShape in_shape ((unsigned int)this->width_, (unsigned int)this->height_,(unsigned int)this->channels_);
    TensorShape out_shape((unsigned int)this->pooled_width_, (unsigned int)this->pooled_height_,(unsigned int)this->channels_);
    checkreshape(in_shape,Caffe::arm_gpu_mode());
    if (!this->init_layer_) return;
    this->init_layer_=false;
    // Initialize ACL.
    if (Caffe::arm_gpu_mode()) {
        new_gpulayer();
    }else{
        new_cpulayer();
    }

    this->force_bypass_acl_path_=false;
    PoolingLayerInfo *pool_info;
    if(this->layer_param_.pooling_param().pool()==PoolingParameter_PoolMethod_MAX)
       pool_info=new PoolingLayerInfo(PoolingType::MAX, this->kernel_w_, PadStrideInfo(this->stride_w_,this->stride_h_,this->pad_w_,this->pad_h_,DimensionRoundingType::CEIL));
    else
       pool_info=new PoolingLayerInfo(PoolingType::AVG, this->kernel_w_, PadStrideInfo(this->stride_w_,this->stride_h_,this->pad_w_,this->pad_h_,DimensionRoundingType::CEIL));

    if (Caffe::arm_gpu_mode()) {
        Dtype *top_data = top[0]->mutable_gpu_data(); 
        const Dtype* bottom_data = bottom[0]->gpu_data();
        new_tensor(this->gpu().input,in_shape,(void*)bottom_data);
        new_tensor(this->gpu().output,out_shape,(void*)top_data);
#ifdef USE_PROFILING
        logtime_util log_time(ACL_CONFIG_INFO);
#endif //USE_PROFILING
        this->gpu().layer->configure(this->gpu().input,this->gpu().output,*pool_info);
    }else{
        Dtype *top_data = top[0]->mutable_cpu_data(); 
        const Dtype* bottom_data = bottom[0]->cpu_data();
        new_tensor(this->cpu().input,in_shape,(void*)bottom_data);
        new_tensor(this->cpu().output,out_shape,(void*)top_data);
#ifdef USE_PROFILING
        logtime_util log_time(ACL_CONFIG_INFO);
#endif //USE_PROFILING
        this->cpu().layer->configure(this->cpu().input,this->cpu().output,*pool_info);
    }
    delete pool_info;
}
template 
void ACLPoolingLayer::Reshape(const vector& bottom,
    const vector& top) {
  PoolingLayer::Reshape(bottom, top);

}

template 
void ACLPoolingLayer::Forward_cpu(const vector& bottom,
    const vector& top) {
  if(Caffe::arm_gpu_mode()){
      Forward_gpu(bottom, top);
      return;
  }         
#ifdef USE_PROFILING
  logtime_util log_time(ACL_POOLING_INFO);
#endif //USE_PROFILING
  if (this->force_bypass_acl_path_|| this->layer_param_.pooling_param().global_pooling()) {
      PoolingLayer::Forward_cpu(bottom,top);
      return;
  }
  const Dtype* bottom_data = bottom[0]->cpu_data();
  Dtype* top_data = top[0]->mutable_cpu_data();
  if (this->layer_param_.pooling_param().pool()!=PoolingParameter_PoolMethod_MAX && 
      this->layer_param_.pooling_param().pool()!=PoolingParameter_PoolMethod_AVE) {
      PoolingLayer::Forward_cpu(bottom,top);
      return ;
  }
  if (this->kernel_h_!=this->kernel_w_ || top.size()>1) {
      PoolingLayer::Forward_cpu(bottom,top);
      return ;
  }
  if (this->kernel_h_!=2 && this->kernel_h_!=3) {
      PoolingLayer::Forward_cpu(bottom,top);
      return ;
  }
  SetupACLLayer(bottom,top);
  for (int n = 0; n < bottom[0]->num(); ++n) {
        tensor_mem(this->cpu().input,(void*)(bottom_data));
        cpu_run();
        tensor_mem((void*)(top_data),this->cpu().output);
        bottom_data += bottom[0]->offset(1);
        top_data += top[0]->offset(1);
  }
}

template 
void ACLPoolingLayer::Forward_gpu(const vector& bottom,
    const vector& top) {
#ifdef USE_PROFILING
  logtime_util log_time(ACL_POOLING_INFO);
#endif //USE_PROFILING
  if (this->force_bypass_acl_path_|| this->layer_param_.pooling_param().global_pooling()) {
      PoolingLayer::Forward_cpu(bottom,top);
      return;
  }
  const Dtype* bottom_data = bottom[0]->gpu_data();
  Dtype* top_data = top[0]->mutable_gpu_data();
  if (this->layer_param_.pooling_param().pool()!=PoolingParameter_PoolMethod_MAX && 
      this->layer_param_.pooling_param().pool()!=PoolingParameter_PoolMethod_AVE) {
      PoolingLayer::Forward_cpu(bottom,top);
      return ;
  }
  if (this->kernel_h_!=this->kernel_w_) {
      PoolingLayer::Forward_cpu(bottom,top);
      return ;
  }
  if (this->kernel_h_!=2 && this->kernel_h_!=3) {
      PoolingLayer::Forward_cpu(bottom,top);
      return ;
  }
  SetupACLLayer(bottom,top);
  for (int n = 0; n < bottom[0]->num(); ++n) {
        tensor_mem(this->gpu().input,(void*)(bottom_data));
        gpu_run();
        tensor_mem((void*)(top_data),this->gpu().output);
        bottom_data += bottom[0]->offset(1);
        top_data += top[0]->offset(1);
  }
}

template 
ACLPoolingLayer::~ACLPoolingLayer() {
}

INSTANTIATE_CLASS(ACLPoolingLayer);

}   // namespace caffe
#endif  // USE_ACL

Web Proxy Viewer  |  New URL  |  Original Page