1 #ifndef CAFFE_ACL_CONV_LAYER_HPP_
2 #define CAFFE_ACL_CONV_LAYER_HPP_
5 #include "caffe/layers/acl_base_conv_layer.hpp"
10 extern bool use_direct_conv_;
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");
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_);
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();
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);
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
42 return shared_ptr<Layer<Dtype> >(new ACLConvolutionLayer<Dtype, CLConvolutionLayer, NEConvolutionLayer>(param));
48 #endif // CAFFE_ACL_CONV_LAYER_HPP_