2fd795c95b5e3c1711db6d2c75e0555936f79967
[platform/upstream/caffeonacl.git] / include / caffe / layers / acl_conv_layer.hpp
1 #ifndef CAFFE_ACL_CONV_LAYER_HPP_
2 #define CAFFE_ACL_CONV_LAYER_HPP_
3
4 #ifdef USE_ACL
5 #include "caffe/layers/acl_base_conv_layer.hpp"
6 #endif
7
8 namespace caffe {
9
10 extern bool use_direct_conv_;
11 #ifdef USE_ACL
12 template <typename Dtype>
13 inline shared_ptr<Layer<Dtype> > GetACLConvolutionLayer(
14     const LayerParameter& param) {
15     ConvolutionParameter conv_param = param.convolution_param();
16     const char* pDirectConv;
17     pDirectConv = getenv ("DIRECTCONV");
18     if (pDirectConv){
19       unsigned int bdirectconv;
20       sscanf(pDirectConv,"%i", &bdirectconv);
21       if(bdirectconv != use_direct_conv_){
22           use_direct_conv_ = bdirectconv;
23           printf("DIRECTCONV<%s>\n", pDirectConv);
24           printf("DIRECTCONV: %x\n", use_direct_conv_);
25       }
26     }
27     int pad_data[3];
28     if (conv_param.has_pad_h() || conv_param.has_pad_w()) {
29       pad_data[0] = conv_param.pad_h();
30       pad_data[1] = conv_param.pad_w();
31     } else {
32       const int kDefaultPad = 0;
33       const int num_pad_dims = conv_param.pad_size();
34       for (int i = 0; i < 2; ++i) {
35         pad_data[i] = (num_pad_dims == 0) ? kDefaultPad :
36             conv_param.pad((num_pad_dims == 1) ? 0 : i);
37       }
38     }
39     if (use_direct_conv_ && ( (conv_param.kernel_size(0)==1 &&pad_data[0]==0 && pad_data[1]==0) || (conv_param.kernel_size(0)==3 && pad_data[0]<=1 && pad_data[1] <=1 ) )) {
40         return shared_ptr<Layer<Dtype> >(new ACLConvolutionLayer<Dtype, CLConvolutionLayer, NEDirectConvolutionLayer>(param)); //NEDirectConvolutionLayer only for 1x1 and 3x3
41     }
42     return shared_ptr<Layer<Dtype> >(new ACLConvolutionLayer<Dtype, CLConvolutionLayer, NEConvolutionLayer>(param)); 
43 }
44 #endif
45
46 }  // namespace caffe
47
48 #endif  // CAFFE_ACL_CONV_LAYER_HPP_