From 25e0cec114d641fd15356edb9e18a4403a0c7309 Mon Sep 17 00:00:00 2001 From: honggui Date: Sat, 26 Aug 2017 12:06:12 +0800 Subject: [PATCH] add support acl batch normal,direct conv, local connect, concat layers --- data/cifar10/get_cifar10.sh | 0 data/ilsvrc12/get_ilsvrc_aux.sh | 0 data/mnist/get_mnist.sh | 0 docs/caffeOnACL_release_notes_0_2_0.docx | Bin 180488 -> 127780 bytes docs/caffeOnACL_user_guide_0_2_0.docx | Bin 472006 -> 550030 bytes examples/cifar10/create_cifar10.sh | 0 examples/cifar10/train_full.sh | 0 examples/cifar10/train_full_sigmoid.sh | 0 examples/cifar10/train_full_sigmoid_bn.sh | 0 examples/cifar10/train_quick.sh | 0 examples/finetune_flickr_style/assemble_data.py | 0 examples/imagenet/create_imagenet.sh | 0 examples/imagenet/make_imagenet_mean.sh | 0 examples/imagenet/resume_training.sh | 0 examples/imagenet/train_caffenet.sh | 0 examples/mnist/create_mnist.sh | 0 examples/mnist/train_lenet.sh | 0 examples/mnist/train_lenet_adam.sh | 0 examples/mnist/train_lenet_consolidated.sh | 0 examples/mnist/train_lenet_docker.sh | 0 examples/mnist/train_lenet_rmsprop.sh | 0 examples/mnist/train_mnist_autoencoder.sh | 0 examples/mnist/train_mnist_autoencoder_adadelta.sh | 0 examples/mnist/train_mnist_autoencoder_adagrad.sh | 0 examples/mnist/train_mnist_autoencoder_nesterov.sh | 0 examples/siamese/create_mnist_siamese.sh | 0 examples/siamese/train_mnist_siamese.sh | 0 include/caffe/acl_layer.hpp | 56 ++++-- include/caffe/layers/acl_base_conv_layer.hpp | 61 ++++++ include/caffe/layers/acl_batch_norm_layer.hpp | 54 ++++++ include/caffe/layers/acl_concat_layer.hpp | 57 ++++++ include/caffe/layers/acl_conv_layer.hpp | 70 +++---- include/caffe/layers/acl_local_connect_layer.hpp | 56 ++++++ include/caffe/layers/local_connect_layer.hpp | 59 ++++++ models/bvlc_googlenet/train_val.prototxt | 0 python/classify.py | 0 python/detect.py | 0 python/draw_net.py | 0 scripts/build_docs.sh | 0 scripts/copy_notebook.py | 0 scripts/cpp_lint.py | 0 scripts/deploy_docs.sh | 0 scripts/download_model_binary.py | 0 scripts/download_model_from_gist.sh | 0 scripts/gather_examples.sh | 0 scripts/split_caffe_proto.py | 0 scripts/travis/build.sh | 0 scripts/travis/configure.sh | 0 scripts/travis/defaults.sh | 0 scripts/travis/install-deps.sh | 0 scripts/travis/install-python-deps.sh | 0 scripts/travis/setup-venv.sh | 0 scripts/travis/test.sh | 0 scripts/upload_model_to_gist.sh | 0 src/caffe/acl_layer.cpp | 25 ++- src/caffe/common.cpp | 3 +- src/caffe/layer_factory.cpp | 29 ++- src/caffe/layers/acl_base_activation_layer.cpp | 8 +- ...{acl_conv_layer.cpp => acl_base_conv_layer.cpp} | 72 +++---- src/caffe/layers/acl_batch_norm_layer.cpp | 158 +++++++++++++++ src/caffe/layers/acl_concat_layer.cpp | 128 +++++++++++++ src/caffe/layers/acl_inner_product_layer.cpp | 20 +- src/caffe/layers/acl_local_connect_layer.cpp | 176 +++++++++++++++++ src/caffe/layers/acl_lrn_layer.cpp | 8 +- src/caffe/layers/acl_pooling_layer.cpp | 12 +- src/caffe/layers/acl_softmax_layer.cpp | 8 +- src/caffe/layers/batch_norm_layer.cpp | 2 + src/caffe/layers/concat_layer.cpp | 2 + src/caffe/layers/local_connect_layer.cpp | 212 +++++++++++++++++++++ src/caffe/proto/caffe.proto | 15 +- tools/extra/extract_seconds.py | 0 tools/extra/launch_resize_and_crop_images.sh | 0 tools/extra/parse_log.py | 0 tools/extra/parse_log.sh | 0 tools/extra/plot_training_log.py.example | 0 tools/extra/resize_and_crop_images.py | 0 tools/extra/summarize.py | 0 unit_tests/Makefile | 80 ++++---- 78 files changed, 1217 insertions(+), 154 deletions(-) mode change 100755 => 100644 data/cifar10/get_cifar10.sh mode change 100755 => 100644 data/ilsvrc12/get_ilsvrc_aux.sh mode change 100755 => 100644 data/mnist/get_mnist.sh mode change 100755 => 100644 examples/cifar10/create_cifar10.sh mode change 100755 => 100644 examples/cifar10/train_full.sh mode change 100755 => 100644 examples/cifar10/train_full_sigmoid.sh mode change 100755 => 100644 examples/cifar10/train_full_sigmoid_bn.sh mode change 100755 => 100644 examples/cifar10/train_quick.sh mode change 100755 => 100644 examples/finetune_flickr_style/assemble_data.py mode change 100755 => 100644 examples/imagenet/create_imagenet.sh mode change 100755 => 100644 examples/imagenet/make_imagenet_mean.sh mode change 100755 => 100644 examples/imagenet/resume_training.sh mode change 100755 => 100644 examples/imagenet/train_caffenet.sh mode change 100755 => 100644 examples/mnist/create_mnist.sh mode change 100755 => 100644 examples/mnist/train_lenet.sh mode change 100755 => 100644 examples/mnist/train_lenet_adam.sh mode change 100755 => 100644 examples/mnist/train_lenet_consolidated.sh mode change 100755 => 100644 examples/mnist/train_lenet_docker.sh mode change 100755 => 100644 examples/mnist/train_lenet_rmsprop.sh mode change 100755 => 100644 examples/mnist/train_mnist_autoencoder.sh mode change 100755 => 100644 examples/mnist/train_mnist_autoencoder_adadelta.sh mode change 100755 => 100644 examples/mnist/train_mnist_autoencoder_adagrad.sh mode change 100755 => 100644 examples/mnist/train_mnist_autoencoder_nesterov.sh mode change 100755 => 100644 examples/siamese/create_mnist_siamese.sh mode change 100755 => 100644 examples/siamese/train_mnist_siamese.sh create mode 100644 include/caffe/layers/acl_base_conv_layer.hpp create mode 100644 include/caffe/layers/acl_batch_norm_layer.hpp create mode 100644 include/caffe/layers/acl_concat_layer.hpp create mode 100644 include/caffe/layers/acl_local_connect_layer.hpp create mode 100644 include/caffe/layers/local_connect_layer.hpp mode change 100755 => 100644 models/bvlc_googlenet/train_val.prototxt mode change 100755 => 100644 python/classify.py mode change 100755 => 100644 python/detect.py mode change 100755 => 100644 python/draw_net.py mode change 100755 => 100644 scripts/build_docs.sh mode change 100755 => 100644 scripts/copy_notebook.py mode change 100755 => 100644 scripts/cpp_lint.py mode change 100755 => 100644 scripts/deploy_docs.sh mode change 100755 => 100644 scripts/download_model_binary.py mode change 100755 => 100644 scripts/download_model_from_gist.sh mode change 100755 => 100644 scripts/gather_examples.sh mode change 100755 => 100644 scripts/split_caffe_proto.py mode change 100755 => 100644 scripts/travis/build.sh mode change 100755 => 100644 scripts/travis/configure.sh mode change 100755 => 100644 scripts/travis/defaults.sh mode change 100755 => 100644 scripts/travis/install-deps.sh mode change 100755 => 100644 scripts/travis/install-python-deps.sh mode change 100755 => 100644 scripts/travis/setup-venv.sh mode change 100755 => 100644 scripts/travis/test.sh mode change 100755 => 100644 scripts/upload_model_to_gist.sh rename src/caffe/layers/{acl_conv_layer.cpp => acl_base_conv_layer.cpp} (64%) create mode 100644 src/caffe/layers/acl_batch_norm_layer.cpp create mode 100644 src/caffe/layers/acl_concat_layer.cpp create mode 100644 src/caffe/layers/acl_local_connect_layer.cpp create mode 100644 src/caffe/layers/local_connect_layer.cpp mode change 100755 => 100644 tools/extra/extract_seconds.py mode change 100755 => 100644 tools/extra/launch_resize_and_crop_images.sh mode change 100755 => 100644 tools/extra/parse_log.py mode change 100755 => 100644 tools/extra/parse_log.sh mode change 100755 => 100644 tools/extra/plot_training_log.py.example mode change 100755 => 100644 tools/extra/resize_and_crop_images.py mode change 100755 => 100644 tools/extra/summarize.py diff --git a/data/cifar10/get_cifar10.sh b/data/cifar10/get_cifar10.sh old mode 100755 new mode 100644 diff --git a/data/ilsvrc12/get_ilsvrc_aux.sh b/data/ilsvrc12/get_ilsvrc_aux.sh old mode 100755 new mode 100644 diff --git a/data/mnist/get_mnist.sh b/data/mnist/get_mnist.sh old mode 100755 new mode 100644 diff --git a/docs/caffeOnACL_release_notes_0_2_0.docx b/docs/caffeOnACL_release_notes_0_2_0.docx index 61e210642644035e9bd7e3257d2cf45fa512fc72..9f7786cdbb922414df9568dca31deac67093389d 100644 GIT binary patch delta 58720 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 X0NrU22$KN1dwS42tKkGXXVCuvM}8oc delta 45664 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 |;v@zCHcM>A;sz>bW*<5d z3>ikN7p90C;1&-;WYkCFs9&gpLTtqGmRPPP2}#G7o6$2&C{T(3mSq5u2vtzPPwq@F z>R?5Q;f(h0kUEH<+{|DxEsxi3namN>@;C-`Tt`=L^9ukK@VeSjwrW*VQu@#J(Mc`) zQwz*D{Cj($o|ZL~)(7(XIFkq?qZRy6gH_9F(P4#vaJkaytPBCwOZM=}!VF{iZTE8z zm`j3Y-G|lC`xYP|;}7T$O10!F(!)L8m-eZn-~ljPXWPWk1#;4I3r+?>uzrA8;CUH8 zy=lNH8rxWIYW5_N6RQTSr`4VXHRZqDl3BzV1wNF?i9YAu?9C=|3#HSXA@~zonm1M04!2ZE zllJQNYC&`y8)@4^0{GTmb=v%LKc+&QnD7dWHOBn_)d?~G7PBS86X~7JR$cq3^s-D zVqY;vRuuo>i%W>VYrsE9rE@V!*BsY+%!eB3F6QtJ$abPgU|pg zAYxJ&g)CsiSq!!+oQdT8Gn!yK;JIEPIux_B?AOYE_N$l*%S52iSu>Bwqg;oEOK`h+ zd4B!GdSW<(oCq)0%8>h{!G_QxLL(105IB;F5g&^Zx|yNz?7Lyn3iI6mv`&-@1T&IH z_4=}!ZFuQxWva+G|8)NOQ1T?wc&_m;rl2%cjI8AGDGBzNrD|eT5&jWNcdRN6$8lCQ zZx4etb?#B96;asTkT^B?BBG{o#GJbfz) zfS2z82BV>0iSPGVh?;y!&-FvARMSpDghez+sEaQ8q`

E}^JvQ3?zG5Oeh+ZE%hT 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 OLKEDHGTZ*_L;W8EKPJ}z diff --git a/docs/caffeOnACL_user_guide_0_2_0.docx b/docs/caffeOnACL_user_guide_0_2_0.docx index 009158503977adbd83032979227f4a340f65c308..cf802b8b87680fd8e3f23b55d899c3f997389327 100644 GIT binary patch delta 54300 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 delta 42139 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 P5r6^~ierIk9^n4~ENuC` diff --git a/examples/cifar10/create_cifar10.sh b/examples/cifar10/create_cifar10.sh old mode 100755 new mode 100644 diff --git a/examples/cifar10/train_full.sh b/examples/cifar10/train_full.sh old mode 100755 new mode 100644 diff --git a/examples/cifar10/train_full_sigmoid.sh b/examples/cifar10/train_full_sigmoid.sh old mode 100755 new mode 100644 diff --git a/examples/cifar10/train_full_sigmoid_bn.sh b/examples/cifar10/train_full_sigmoid_bn.sh old mode 100755 new mode 100644 diff --git a/examples/cifar10/train_quick.sh b/examples/cifar10/train_quick.sh old mode 100755 new mode 100644 diff --git a/examples/finetune_flickr_style/assemble_data.py b/examples/finetune_flickr_style/assemble_data.py old mode 100755 new mode 100644 diff --git a/examples/imagenet/create_imagenet.sh b/examples/imagenet/create_imagenet.sh old mode 100755 new mode 100644 diff --git a/examples/imagenet/make_imagenet_mean.sh b/examples/imagenet/make_imagenet_mean.sh old mode 100755 new mode 100644 diff --git a/examples/imagenet/resume_training.sh b/examples/imagenet/resume_training.sh old mode 100755 new mode 100644 diff --git a/examples/imagenet/train_caffenet.sh b/examples/imagenet/train_caffenet.sh old mode 100755 new mode 100644 diff --git a/examples/mnist/create_mnist.sh b/examples/mnist/create_mnist.sh old mode 100755 new mode 100644 diff --git a/examples/mnist/train_lenet.sh b/examples/mnist/train_lenet.sh old mode 100755 new mode 100644 diff --git a/examples/mnist/train_lenet_adam.sh b/examples/mnist/train_lenet_adam.sh old mode 100755 new mode 100644 diff --git a/examples/mnist/train_lenet_consolidated.sh b/examples/mnist/train_lenet_consolidated.sh old mode 100755 new mode 100644 diff --git a/examples/mnist/train_lenet_docker.sh b/examples/mnist/train_lenet_docker.sh old mode 100755 new mode 100644 diff --git a/examples/mnist/train_lenet_rmsprop.sh b/examples/mnist/train_lenet_rmsprop.sh old mode 100755 new mode 100644 diff --git a/examples/mnist/train_mnist_autoencoder.sh b/examples/mnist/train_mnist_autoencoder.sh old mode 100755 new mode 100644 diff --git a/examples/mnist/train_mnist_autoencoder_adadelta.sh b/examples/mnist/train_mnist_autoencoder_adadelta.sh old mode 100755 new mode 100644 diff --git a/examples/mnist/train_mnist_autoencoder_adagrad.sh b/examples/mnist/train_mnist_autoencoder_adagrad.sh old mode 100755 new mode 100644 diff --git a/examples/mnist/train_mnist_autoencoder_nesterov.sh b/examples/mnist/train_mnist_autoencoder_nesterov.sh old mode 100755 new mode 100644 diff --git a/examples/siamese/create_mnist_siamese.sh b/examples/siamese/create_mnist_siamese.sh old mode 100755 new mode 100644 diff --git a/examples/siamese/train_mnist_siamese.sh b/examples/siamese/train_mnist_siamese.sh old mode 100755 new mode 100644 diff --git a/include/caffe/acl_layer.hpp b/include/caffe/acl_layer.hpp index db9fee5..b188bb8 100644 --- a/include/caffe/acl_layer.hpp +++ b/include/caffe/acl_layer.hpp @@ -3,6 +3,7 @@ #ifdef USE_ACL #include "arm_compute/runtime/NEON/functions/NEConvolutionLayer.h" +#include "arm_compute/runtime/NEON/functions/NEDirectConvolutionLayer.h" #include "arm_compute/runtime/CL/functions/CLConvolutionLayer.h" #include "arm_compute/runtime/NEON/functions/NEActivationLayer.h" #include "arm_compute/runtime/CL/functions/CLActivationLayer.h" @@ -14,6 +15,14 @@ #include "arm_compute/runtime/CL/functions/CLSoftmaxLayer.h" #include "arm_compute/runtime/NEON/functions/NEFullyConnectedLayer.h" #include "arm_compute/runtime/CL/functions/CLFullyConnectedLayer.h" +#include "arm_compute/runtime/NEON/functions/NELocallyConnectedLayer.h" +#include "arm_compute/runtime/CL/functions/CLLocallyConnectedLayer.h" +#include "arm_compute/runtime/NEON/functions/NEBatchNormalizationLayer.h" +#include "arm_compute/runtime/CL/functions/CLBatchNormalizationLayer.h" +#include "arm_compute/core/NEON/kernels/NEDepthConcatenateKernel.h" +#include "arm_compute/runtime/NEON/functions/NEDepthConcatenate.h" +#include "arm_compute/core/CL/kernels/CLDepthConcatenateKernel.h" +#include "arm_compute/runtime/CL/functions/CLDepthConcatenate.h" #include "arm_compute/runtime/CL/CLTensor.h" #include "arm_compute/runtime/Tensor.h" #include "arm_compute/runtime/CL/CLScheduler.h" @@ -28,6 +37,9 @@ using namespace arm_compute; #define FLAGS_ENABLE_ACL_SIGMOID 0x00000080 #define FLAGS_ENABLE_ACL_SOFTMAX 0x00000100 #define FLAGS_ENABLE_ACL_TANH 0x00000200 +#define FLAGS_ENABLE_ACL_LC 0x00000400 +#define FLAGS_ENABLE_ACL_BN 0x00000800 +#define FLAGS_ENABLE_ACL_CONCAT 0x00001000 extern unsigned int bypass_acl_class_layer; #endif #ifdef USE_PROFILING @@ -48,6 +60,9 @@ extern unsigned int bypass_acl_class_layer; #define MASK_LOG_SIGMOID 0x00001000 #define MASK_LOG_SOFTMAX 0x00002000 #define MASK_LOG_TANH 0x00004000 +#define MASK_LOG_LC 0x00008000 +#define MASK_LOG_BN 0x00010000 +#define MASK_LOG_CONCAT 0x00020000 #define APP_TIME_INFO MASK_LOG_APP_TIME,"time: \t" #define ACL_ALLOCATE_INFO MASK_LOG_ALLOCATE,"allocate: \t\t" #define ACL_RUN_INFO MASK_LOG_RUN, "run: \t\t\t" @@ -63,6 +78,9 @@ extern unsigned int bypass_acl_class_layer; #define ACL_SIGMOID_INFO MASK_LOG_SIGMOID, "ACL_SIGMOID:\t\t\t\t\t\t\t\t\t\t\t\t\t" #define ACL_SOFTMAX_INFO MASK_LOG_SOFTMAX, "ACL_SOFTMAX:\t\t\t\t\t\t\t\t\t\t\t\t\t\t" #define ACL_TANH_INFO MASK_LOG_TANH, "ACL_TANH :\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t" +#define ACL_LC_INFO MASK_LOG_LC, "ACL_LC :\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t" +#define ACL_BN_INFO MASK_LOG_BN, "ACL_BN :\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t" +#define ACL_CONCAT_INFO MASK_LOG_CONCAT, "ACL_CONCAT :\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t" extern unsigned int acl_log_flags; #endif //USE_PROFILING namespace caffe { @@ -72,6 +90,7 @@ enum TensorType{ tensor_output, tensor_weights, tensor_biases, + tensor_data, }; template class BaseTensor:public ACLTensor{ @@ -88,7 +107,7 @@ public: }; virtual void map(bool blocking = true){} virtual void unmap(){} - virtual void commit(); + virtual void commit(TensorType type=tensor_data); int tensor_copy(void * mem, bool toTensor=true); protected: void* mem_; @@ -129,20 +148,16 @@ class ACLXPUBaseLayer{ public: virtual void commit(){ if (input) { - input->settensortype(tensor_input); - input->commit(); + input->commit(tensor_input); } if (output){ - output->settensortype(tensor_output); - output->commit(); + output->commit(tensor_output); } if (weights){ - weights->settensortype(tensor_weights); - weights->commit(); + weights->commit(tensor_weights); } if (biases){ - biases->settensortype(tensor_biases); - biases->commit(); + biases->commit(tensor_biases); } } virtual void run(bool gpu){ @@ -163,6 +178,10 @@ public: output=nullptr; weights=nullptr; biases=nullptr; + mean=nullptr; + var=nullptr; + beta=nullptr; + gamma=nullptr; #ifdef USE_CONV_CACHE for(int i = 0; i < 16; ++i){ cache.layer[i] = nullptr; @@ -180,12 +199,20 @@ public: if (output) delete output; if (weights) delete weights; if (biases) delete biases; + if (mean) delete mean; + if (var) delete var; + if (beta) delete beta; + if (gamma) delete gamma; #endif //USE_CONV_CACHE layer=nullptr; input=nullptr; output=nullptr; weights=nullptr; biases=nullptr; + mean=nullptr; + var=nullptr; + beta=nullptr; + gamma=nullptr; } virtual ~ACLXPUBaseLayer(){ freelayer(); @@ -195,6 +222,11 @@ public: ACLTensor *output; ACLTensor *weights; ACLTensor *biases; + //for BN + ACLTensor *mean; + ACLTensor *var; + ACLTensor *beta; + ACLTensor *gamma; #ifdef USE_CONV_CACHE struct{ ACLLayer *layer[16]; @@ -223,7 +255,7 @@ public: bool checkreshape(TensorShape shape,bool gpu=false, TensorType type=tensor_input); template bool tensor_mem(ACLTensor *tensor,void *mem,bool share=false); template bool tensor_mem(void *mem,ACLTensor *tensor,bool share=false); - template ACLTensor * new_tensor(TensorShape shape,void *mem=nullptr,bool share=false); + template bool new_tensor(ACLTensor *&tensor,TensorShape shape,void *mem=nullptr,bool share=false); protected: ACLXPUBaseLayer gpu_; ACLXPUBaseLayer cpu_; @@ -238,9 +270,9 @@ protected: template class ACLBaseLayer; #define INSTANTIATE_ACLBASE_FUNCTION(GPULayer,CPULayer,ACLTensor) \ - template bool ACLBaseLayer::tensor_mem(ACLTensor *tensor,void *mem,bool share); \ + template bool ACLBaseLayer::tensor_mem(ACLTensor *tensor,void *mem,bool share); \ template bool ACLBaseLayer::tensor_mem(void *mem,ACLTensor *tensor,bool share); \ - template ACLTensor * ACLBaseLayer::new_tensor(TensorShape shape,void *mem,bool share); \ + template bool ACLBaseLayer::new_tensor(ACLTensor *&tensor,TensorShape shape,void *mem,bool share); \ #endif diff --git a/include/caffe/layers/acl_base_conv_layer.hpp b/include/caffe/layers/acl_base_conv_layer.hpp new file mode 100644 index 0000000..6b38eb2 --- /dev/null +++ b/include/caffe/layers/acl_base_conv_layer.hpp @@ -0,0 +1,61 @@ +#ifndef CAFFE_ACL_BASE_CONV_LAYER_HPP_ +#define CAFFE_ACL_BASE_CONV_LAYER_HPP_ + +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" + +#include "caffe/layers/conv_layer.hpp" + +#ifdef USE_ACL +#include "caffe/acl_layer.hpp" +#endif + +namespace caffe { + +#ifdef USE_ACL +/* + * @brief ACL implementation of ConvolutionLayer. + * Fallback to ConvolutionLayer for some corner cases. + * +*/ +template +class ACLConvolutionLayer : public ACLBaseLayer,public ConvolutionLayer { + public: + explicit ACLConvolutionLayer(const LayerParameter& param) + : ConvolutionLayer(param) {} + virtual void LayerSetUp(const vector*>& bottom, + const vector*>& top); + virtual void Reshape(const vector*>& bottom, + const vector*>& top); + virtual ~ACLConvolutionLayer(); + + protected: + virtual void Forward_gpu(const vector*>& bottom, + const vector*>& top); + virtual void Forward_cpu(const vector*>& bottom, + const vector*>& top); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, const vector*>& bottom){ + NOT_IMPLEMENTED; + } + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, const vector*>& bottom){ + NOT_IMPLEMENTED; + } + virtual void SetupACLLayer(const vector*>& bottom, + const vector*>& top); + +}; +#endif + +} // namespace caffe + +// Instantiate a class with float and double specifications. +#define INSTANTIATE_CONV_CLASS(classname,GPUConvLayer,CPUConvLayer) \ + template class classname; \ + template class classname + +#endif // CAFFE_ACL_BASE_CONV_LAYER_HPP_ diff --git a/include/caffe/layers/acl_batch_norm_layer.hpp b/include/caffe/layers/acl_batch_norm_layer.hpp new file mode 100644 index 0000000..e899804 --- /dev/null +++ b/include/caffe/layers/acl_batch_norm_layer.hpp @@ -0,0 +1,54 @@ +#ifndef CAFFE_ACL_BATCH_NORMAL_HPP_ +#define CAFFE_ACL_BATCH_NORMAL_HPP_ + +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" + +#include "caffe/layers/batch_norm_layer.hpp" + +#ifdef USE_ACL +#include "caffe/acl_layer.hpp" +#endif + +namespace caffe { + +#ifdef USE_ACL +/* + * @brief ACL implementation of BatchNormLayer. + * Fallback to BatchNormLayer for some corner cases. +*/ +template +class ACLBatchNormLayer : public ACLBaseLayer,public BatchNormLayer { + public: + explicit ACLBatchNormLayer(const LayerParameter& param) + : BatchNormLayer(param) {} + virtual void LayerSetUp(const vector*>& bottom, + const vector*>& top); + virtual void Reshape(const vector*>& bottom, + const vector*>& top); + virtual ~ACLBatchNormLayer(); + + protected: + virtual void Forward_gpu(const vector*>& bottom, + const vector*>& top); + virtual void Forward_cpu(const vector*>& bottom, + const vector*>& top); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, const vector*>& bottom){ + NOT_IMPLEMENTED; + } + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, const vector*>& bottom){ + NOT_IMPLEMENTED; + } + virtual void SetupACLLayer(const vector*>& bottom, + const vector*>& top); +}; +#endif + +} // namespace caffe + +#endif // CAFFE_ACL_BATCH_NORMAL_HPP_ diff --git a/include/caffe/layers/acl_concat_layer.hpp b/include/caffe/layers/acl_concat_layer.hpp new file mode 100644 index 0000000..9021219 --- /dev/null +++ b/include/caffe/layers/acl_concat_layer.hpp @@ -0,0 +1,57 @@ +#ifndef CAFFE_ACL_CONCAT_LAYER_HPP_ +#define CAFFE_ACL_CONCAT_LAYER_HPP_ + +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" + +#include "caffe/layers/concat_layer.hpp" + +#ifdef USE_ACL +#include "caffe/acl_layer.hpp" +#endif + +namespace caffe { + +#ifdef USE_ACL +/* + * @brief ACL implementation of ConcatLayer. + * Fallback to ConcatLayer for some corner cases. +*/ +template +class ACLConcatLayer : public ACLBaseLayer,public ConcatLayer { + public: + explicit ACLConcatLayer(const LayerParameter& param) + : ConcatLayer(param) {} + virtual void LayerSetUp(const vector*>& bottom, + const vector*>& top); + virtual void Reshape(const vector*>& bottom, + const vector*>& top); + virtual ~ACLConcatLayer(); + + protected: + virtual void Forward_gpu(const vector*>& bottom, + const vector*>& top); + virtual void Forward_cpu(const vector*>& bottom, + const vector*>& top); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, const vector*>& bottom){ + NOT_IMPLEMENTED; + } + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, const vector*>& bottom){ + NOT_IMPLEMENTED; + } + virtual void SetupACLLayer(const vector*>& bottom, + const vector*>& top); + private: + std::vector cpu_vectors; + std::vector gpu_vectors; +}; +#endif + +} // namespace caffe + +#endif // CAFFE_ACL_CONCAT_LAYER_HPP_ diff --git a/include/caffe/layers/acl_conv_layer.hpp b/include/caffe/layers/acl_conv_layer.hpp index b4a7584..2fd795c 100644 --- a/include/caffe/layers/acl_conv_layer.hpp +++ b/include/caffe/layers/acl_conv_layer.hpp @@ -1,54 +1,46 @@ #ifndef CAFFE_ACL_CONV_LAYER_HPP_ #define CAFFE_ACL_CONV_LAYER_HPP_ -#include - -#include "caffe/blob.hpp" -#include "caffe/layer.hpp" -#include "caffe/proto/caffe.pb.h" - -#include "caffe/layers/conv_layer.hpp" - #ifdef USE_ACL -#include "caffe/acl_layer.hpp" +#include "caffe/layers/acl_base_conv_layer.hpp" #endif namespace caffe { +extern bool use_direct_conv_; #ifdef USE_ACL -/* - * @brief ACL implementation of ConvolutionLayer. - * Fallback to ConvolutionLayer for some corner cases. - * -*/ template -class ACLConvolutionLayer : public ACLBaseLayer,public ConvolutionLayer { - public: - explicit ACLConvolutionLayer(const LayerParameter& param) - : ConvolutionLayer(param) {} - virtual void LayerSetUp(const vector*>& bottom, - const vector*>& top); - virtual void Reshape(const vector*>& bottom, - const vector*>& top); - virtual ~ACLConvolutionLayer(); - - protected: - virtual void Forward_gpu(const vector*>& bottom, - const vector*>& top); - virtual void Forward_cpu(const vector*>& bottom, - const vector*>& top); - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, const vector*>& bottom){ - NOT_IMPLEMENTED; +inline shared_ptr > GetACLConvolutionLayer( + const LayerParameter& param) { + ConvolutionParameter conv_param = param.convolution_param(); + const char* pDirectConv; + pDirectConv = getenv ("DIRECTCONV"); + if (pDirectConv){ + unsigned int bdirectconv; + sscanf(pDirectConv,"%i", &bdirectconv); + if(bdirectconv != use_direct_conv_){ + use_direct_conv_ = bdirectconv; + printf("DIRECTCONV<%s>\n", pDirectConv); + printf("DIRECTCONV: %x\n", use_direct_conv_); } - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, const vector*>& bottom){ - NOT_IMPLEMENTED; + } + int pad_data[3]; + if (conv_param.has_pad_h() || conv_param.has_pad_w()) { + pad_data[0] = conv_param.pad_h(); + pad_data[1] = conv_param.pad_w(); + } else { + const int kDefaultPad = 0; + const int num_pad_dims = conv_param.pad_size(); + for (int i = 0; i < 2; ++i) { + pad_data[i] = (num_pad_dims == 0) ? kDefaultPad : + conv_param.pad((num_pad_dims == 1) ? 0 : i); } - virtual void SetupACLLayer(const vector*>& bottom, - const vector*>& top); - -}; + } + 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 ) )) { + return shared_ptr >(new ACLConvolutionLayer(param)); //NEDirectConvolutionLayer only for 1x1 and 3x3 + } + return shared_ptr >(new ACLConvolutionLayer(param)); +} #endif } // namespace caffe diff --git a/include/caffe/layers/acl_local_connect_layer.hpp b/include/caffe/layers/acl_local_connect_layer.hpp new file mode 100644 index 0000000..fdb3075 --- /dev/null +++ b/include/caffe/layers/acl_local_connect_layer.hpp @@ -0,0 +1,56 @@ +#ifndef CAFFE_ACL_LOCALCONNECT_LAYER_HPP_ +#define CAFFE_ACL_LOCALCONNECT_LAYER_HPP_ + +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" + +#include "caffe/layers/local_connect_layer.hpp" + +#ifdef USE_ACL +#include "caffe/acl_layer.hpp" +#endif + +namespace caffe { + +#ifdef USE_ACL +/* + * @brief ACL implementation of LocalConnectLayer. + * Fallback to LocalConnectLayer for some corner cases. + * +*/ +template +class ACLLocalConnectLayer : public ACLBaseLayer,public LocalConnectLayer { + public: + explicit ACLLocalConnectLayer(const LayerParameter& param) + : LocalConnectLayer(param) {} + virtual void LayerSetUp(const vector*>& bottom, + const vector*>& top); + virtual void Reshape(const vector*>& bottom, + const vector*>& top); + virtual ~ACLLocalConnectLayer(); + + protected: + virtual void Forward_gpu(const vector*>& bottom, + const vector*>& top); + virtual void Forward_cpu(const vector*>& bottom, + const vector*>& top); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, const vector*>& bottom){ + NOT_IMPLEMENTED; + } + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, const vector*>& bottom){ + NOT_IMPLEMENTED; + } + virtual void SetupACLLayer(const vector*>& bottom, + const vector*>& top); + +}; +#endif + +} // namespace caffe + +#endif // CAFFE_ACL_LOCALCONNECT_LAYER_HPP_ diff --git a/include/caffe/layers/local_connect_layer.hpp b/include/caffe/layers/local_connect_layer.hpp new file mode 100644 index 0000000..4dda978 --- /dev/null +++ b/include/caffe/layers/local_connect_layer.hpp @@ -0,0 +1,59 @@ +#ifndef CAFFE_LOCALCONNECT_LAYERS_HPP_ +#define CAFFE_LOCALCONNECT_LAYERS_HPP_ + +#include +#include +#include + +#include "caffe/blob.hpp" +#include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/util/im2col.hpp" + +namespace caffe { + +template +class LocalConnectLayer : public Layer { + public: + explicit LocalConnectLayer(const LayerParameter& param) + : Layer(param) {} + virtual void LayerSetUp(const vector*>& bottom, + const vector*>& top); + virtual void Reshape(const vector*>& bottom, + const vector*>& top); + + virtual inline int MinBottomBlobs() const { return 1; } + virtual inline int MinTopBlobs() const { return 1; } + virtual inline bool EqualNumBottomTopBlobs() const { return true; } + + protected: + virtual void Forward_cpu(const vector*>& bottom, + const vector*>& top); + virtual void Forward_gpu(const vector*>& bottom, + const vector*>& top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, const vector*>& bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, const vector*>& bottom); + + + int kernel_size_; + int stride_; + int dilation_; + int num_; + int channels_; + int pad_; + int height_, width_; + int height_out_, width_out_; + int num_output_; + bool bias_term_; + + int M_; + int K_; + int N_; + + Blob col_buffer_; +}; +} // namespace caffe + +#endif // CAFFE_LOCALCONNECT_LAYERS_HPP_ diff --git a/models/bvlc_googlenet/train_val.prototxt b/models/bvlc_googlenet/train_val.prototxt old mode 100755 new mode 100644 diff --git a/python/classify.py b/python/classify.py old mode 100755 new mode 100644 diff --git a/python/detect.py b/python/detect.py old mode 100755 new mode 100644 diff --git a/python/draw_net.py b/python/draw_net.py old mode 100755 new mode 100644 diff --git a/scripts/build_docs.sh b/scripts/build_docs.sh old mode 100755 new mode 100644 diff --git a/scripts/copy_notebook.py b/scripts/copy_notebook.py old mode 100755 new mode 100644 diff --git a/scripts/cpp_lint.py b/scripts/cpp_lint.py old mode 100755 new mode 100644 diff --git a/scripts/deploy_docs.sh b/scripts/deploy_docs.sh old mode 100755 new mode 100644 diff --git a/scripts/download_model_binary.py b/scripts/download_model_binary.py old mode 100755 new mode 100644 diff --git a/scripts/download_model_from_gist.sh b/scripts/download_model_from_gist.sh old mode 100755 new mode 100644 diff --git a/scripts/gather_examples.sh b/scripts/gather_examples.sh old mode 100755 new mode 100644 diff --git a/scripts/split_caffe_proto.py b/scripts/split_caffe_proto.py old mode 100755 new mode 100644 diff --git a/scripts/travis/build.sh b/scripts/travis/build.sh old mode 100755 new mode 100644 diff --git a/scripts/travis/configure.sh b/scripts/travis/configure.sh old mode 100755 new mode 100644 diff --git a/scripts/travis/defaults.sh b/scripts/travis/defaults.sh old mode 100755 new mode 100644 diff --git a/scripts/travis/install-deps.sh b/scripts/travis/install-deps.sh old mode 100755 new mode 100644 diff --git a/scripts/travis/install-python-deps.sh b/scripts/travis/install-python-deps.sh old mode 100755 new mode 100644 diff --git a/scripts/travis/setup-venv.sh b/scripts/travis/setup-venv.sh old mode 100755 new mode 100644 diff --git a/scripts/travis/test.sh b/scripts/travis/test.sh old mode 100755 new mode 100644 diff --git a/scripts/upload_model_to_gist.sh b/scripts/upload_model_to_gist.sh old mode 100755 new mode 100644 diff --git a/src/caffe/acl_layer.cpp b/src/caffe/acl_layer.cpp index 4c20037..84f201d 100644 --- a/src/caffe/acl_layer.cpp +++ b/src/caffe/acl_layer.cpp @@ -28,6 +28,9 @@ unsigned int acl_log_flags = (0 | \ MASK_LOG_SIGMOID | \ MASK_LOG_SOFTMAX | \ MASK_LOG_TANH | \ + MASK_LOG_LC | \ + MASK_LOG_BN | \ + MASK_LOG_CONCAT | \ 0); #include /* printf */ #include /* getenv */ @@ -75,20 +78,21 @@ template ACLBaseLayer::~ACLBaseLayer(){ } template -template ACLTensor * ACLBaseLayer::new_tensor(TensorShape shape,void *mem,bool share) +template bool ACLBaseLayer::new_tensor(ACLTensor *&tensor,TensorShape shape,void *mem,bool share) { - ACLTensor * tensor=new ACLTensor(share); + tensor=new ACLTensor(share); #if 1 //F32 tensor->allocator()->init(TensorInfo(shape, Format::F32)); #else //F16 tensor->allocator()->init(TensorInfo(shape, Format::F16)); #endif tensor->bindmem(mem,share); - return tensor; + return true; } template -void BaseTensor::commit(){ +void BaseTensor::commit(TensorType type){ + settensortype(type); if (!share_&&mem_) { if (!allocate_){ #ifdef USE_PROFILING @@ -268,7 +272,18 @@ INSTANTIATE_ACLBASECLASS(CLFullyConnectedLayer,NEFullyConnectedLayer); INSTANTIATE_ACLBASECLASS(CLConvolutionLayer,NEConvolutionLayer); INSTANTIATE_ACLBASE_FUNCTION(CLConvolutionLayer,NEConvolutionLayer,GPUTensor); INSTANTIATE_ACLBASE_FUNCTION(CLConvolutionLayer,NEConvolutionLayer,CPUTensor); - +INSTANTIATE_ACLBASECLASS(CLConvolutionLayer,NEDirectConvolutionLayer); + INSTANTIATE_ACLBASE_FUNCTION(CLConvolutionLayer,NEDirectConvolutionLayer,GPUTensor); + INSTANTIATE_ACLBASE_FUNCTION(CLConvolutionLayer,NEDirectConvolutionLayer,CPUTensor); +INSTANTIATE_ACLBASECLASS(CLBatchNormalizationLayer,NEBatchNormalizationLayer); + INSTANTIATE_ACLBASE_FUNCTION(CLBatchNormalizationLayer,NEBatchNormalizationLayer,GPUTensor); + INSTANTIATE_ACLBASE_FUNCTION(CLBatchNormalizationLayer,NEBatchNormalizationLayer,CPUTensor); +INSTANTIATE_ACLBASECLASS(CLLocallyConnectedLayer,NELocallyConnectedLayer); + INSTANTIATE_ACLBASE_FUNCTION(CLLocallyConnectedLayer,NELocallyConnectedLayer,GPUTensor); + INSTANTIATE_ACLBASE_FUNCTION(CLLocallyConnectedLayer,NELocallyConnectedLayer,CPUTensor); +INSTANTIATE_ACLBASECLASS(CLDepthConcatenate,NEDepthConcatenate); + INSTANTIATE_ACLBASE_FUNCTION(CLDepthConcatenate,NEDepthConcatenate,GPUTensor); + INSTANTIATE_ACLBASE_FUNCTION(CLDepthConcatenate,NEDepthConcatenate,CPUTensor); } #endif diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 6a0ab94..f1db7dd 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -3,12 +3,11 @@ #include #include #include +#include #include "caffe/common.hpp" #include "caffe/util/rng.hpp" #ifdef USE_ACL -#include - #include "arm_compute/runtime/CL/CLScheduler.h" using namespace arm_compute; #endif diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index f7bf886..f9e2908 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -38,6 +38,9 @@ #include "caffe/layers/acl_sigmoid_layer.hpp" #include "caffe/layers/acl_softmax_layer.hpp" #include "caffe/layers/acl_tanh_layer.hpp" +#include "caffe/layers/acl_local_connect_layer.hpp" +#include "caffe/layers/acl_batch_norm_layer.hpp" +#include "caffe/layers/acl_concat_layer.hpp" #endif #ifdef WITH_PYTHON_LAYER @@ -53,7 +56,7 @@ shared_ptr > GetConvolutionLayer( ConvolutionParameter conv_param = param.convolution_param(); ConvolutionParameter_Engine engine = conv_param.engine(); #ifdef USE_ACL - return shared_ptr >(new ACLConvolutionLayer(param)); + return GetACLConvolutionLayer(param); #endif #ifdef USE_CUDNN bool use_dilation = false; @@ -303,6 +306,30 @@ shared_ptr > GetInnerProductLayer(const LayerParameter& param) { REGISTER_LAYER_CREATOR(InnerProduct, GetInnerProductLayer); +// Get BatchNorm layer according to engine. +template +shared_ptr > GetBatchNormLayer(const LayerParameter& param) { + return shared_ptr >(new ACLBatchNormLayer(param)); +} + +REGISTER_LAYER_CREATOR(BatchNorm, GetBatchNormLayer); + +// Get LocalConnect layer according to engine. +template +shared_ptr > GetLocalConnectLayer(const LayerParameter& param) { + return shared_ptr >(new ACLLocalConnectLayer(param)); +} + +REGISTER_LAYER_CREATOR(LocalConnect, GetLocalConnectLayer); + +// Get Concat layer according to engine. +template +shared_ptr > GetConcatLayer(const LayerParameter& param) { + return shared_ptr >(new ACLConcatLayer(param)); +} + +REGISTER_LAYER_CREATOR(Concat, GetConcatLayer); + #endif // USE_ACL #ifdef WITH_PYTHON_LAYER diff --git a/src/caffe/layers/acl_base_activation_layer.cpp b/src/caffe/layers/acl_base_activation_layer.cpp index 2595a95..1fcd682 100644 --- a/src/caffe/layers/acl_base_activation_layer.cpp +++ b/src/caffe/layers/acl_base_activation_layer.cpp @@ -39,8 +39,8 @@ void ACLBaseActivationLayer::SetupACLLayer(const vector*>& bo if (Caffe::arm_gpu_mode()) { Dtype *top_data = top[0]->mutable_gpu_data(); const Dtype* bottom_data = bottom[0]->gpu_data(); - this->gpu().input=new_tensor(input_shape,(void*)bottom_data); - this->gpu().output=new_tensor(output_shape,(void*)top_data); + new_tensor(this->gpu().input,input_shape,(void*)bottom_data); + new_tensor(this->gpu().output,output_shape,(void*)top_data); #ifdef USE_PROFILING logtime_util log_time(ACL_CONFIG_INFO); #endif //USE_PROFILING @@ -48,8 +48,8 @@ void ACLBaseActivationLayer::SetupACLLayer(const vector*>& bo }else{ Dtype *top_data = top[0]->mutable_cpu_data(); const Dtype* bottom_data = bottom[0]->cpu_data(); - this->cpu().input=new_tensor(input_shape,(void*)bottom_data); - this->cpu().output=new_tensor(output_shape,(void*)top_data); + new_tensor(this->cpu().input,input_shape,(void*)bottom_data); + new_tensor(this->cpu().output,output_shape,(void*)top_data); #ifdef USE_PROFILING logtime_util log_time(ACL_CONFIG_INFO); #endif //USE_PROFILING diff --git a/src/caffe/layers/acl_conv_layer.cpp b/src/caffe/layers/acl_base_conv_layer.cpp similarity index 64% rename from src/caffe/layers/acl_conv_layer.cpp rename to src/caffe/layers/acl_base_conv_layer.cpp index 02732fb..e3c5899 100644 --- a/src/caffe/layers/acl_conv_layer.cpp +++ b/src/caffe/layers/acl_base_conv_layer.cpp @@ -7,26 +7,27 @@ namespace caffe { -template -void ACLConvolutionLayer::LayerSetUp( +bool use_direct_conv_=false; +template +void ACLConvolutionLayer::LayerSetUp( const vector*>& bottom, const vector*>& top) { ConvolutionLayer::LayerSetUp(bottom, top); this->force_bypass_acl_path_= bypass_acl_class_layer & FLAGS_ENABLE_ACL_CONV; } -template -void ACLConvolutionLayer::SetupACLLayer(const vector*>& bottom, +template +void ACLConvolutionLayer::SetupACLLayer(const vector*>& bottom, const vector*>& top){ TensorShape input_shape((unsigned int)bottom[0]->width(), (unsigned int)bottom[0]->height(),(unsigned int)bottom[0]->channels(),(unsigned int)bottom[0]->num()); - checkreshape(input_shape,Caffe::arm_gpu_mode()); + ACLBaseLayer::checkreshape(input_shape,Caffe::arm_gpu_mode()); if (!this->init_layer_) return; this->init_layer_=false; // Initialize ACL. if (Caffe::arm_gpu_mode()) { - new_gpulayer(); + ACLBaseLayer::new_gpulayer(); }else{ - new_cpulayer(); + ACLBaseLayer::new_cpulayer(); } this->force_bypass_acl_path_=false; ConvolutionParameter conv_param = this->layer_param_.convolution_param(); @@ -45,18 +46,18 @@ void ACLConvolutionLayer::SetupACLLayer(const vector*>& botto Dtype *top_data = top[0]->mutable_gpu_data(); const Dtype* bottom_data = bottom[0]->gpu_data(); //[kernel_x, kernel_y, IFM, OFM] - this->gpu().weights=new_tensor(weights_shape,(void*)(this->blobs_[0].get()->mutable_gpu_data())); - tensor_mem(this->gpu().weights,(void*)(this->blobs_[0].get()->mutable_gpu_data())); + ACLBaseLayer::new_tensor(this->gpu().weights,weights_shape,(void*)(this->blobs_[0].get()->mutable_gpu_data())); + ACLBaseLayer::tensor_mem(this->gpu().weights,(void*)(this->blobs_[0].get()->mutable_gpu_data())); //[OFM] if (this->bias_term_) { - this->gpu().biases=new_tensor(biases_shape,(void*)(this->blobs_[1].get()->mutable_gpu_data())); - tensor_mem(this->gpu().biases,(void*)(this->blobs_[1].get()->mutable_gpu_data())); + ACLBaseLayer::new_tensor(this->gpu().biases,biases_shape,(void*)(this->blobs_[1].get()->mutable_gpu_data())); + ACLBaseLayer::tensor_mem(this->gpu().biases,(void*)(this->blobs_[1].get()->mutable_gpu_data())); } //[width, height, IFM] - this->gpu().input=new_tensor(input_shape,(void*)bottom_data); + ACLBaseLayer::new_tensor(this->gpu().input,input_shape,(void*)bottom_data); //[width, height, OFM] - this->gpu().output=new_tensor(output_shape,(void*)top_data); + ACLBaseLayer::new_tensor(this->gpu().output,output_shape,(void*)top_data); #ifdef USE_PROFILING { logtime_util log_time(ACL_CONFIG_INFO); @@ -82,18 +83,18 @@ void ACLConvolutionLayer::SetupACLLayer(const vector*>& botto Dtype *top_data = top[0]->mutable_cpu_data(); const Dtype* bottom_data = bottom[0]->cpu_data(); //[kernel_x, kernel_y, IFM, OFM] - this->cpu().weights=new_tensor(weights_shape,(void*)(this->blobs_[0].get()->mutable_cpu_data())); - tensor_mem(this->cpu().weights,(void*)(this->blobs_[0].get()->mutable_cpu_data())); + ACLBaseLayer::new_tensor(this->cpu().weights,weights_shape,(void*)(this->blobs_[0].get()->mutable_cpu_data())); + ACLBaseLayer::tensor_mem(this->cpu().weights,(void*)(this->blobs_[0].get()->mutable_cpu_data())); //[OFM] if (this->bias_term_) { - this->cpu().biases=new_tensor(biases_shape,(void*)(this->blobs_[1].get()->mutable_cpu_data())); - tensor_mem(this->cpu().biases,(void*)(this->blobs_[1].get()->mutable_cpu_data())); + ACLBaseLayer::new_tensor(this->cpu().biases,biases_shape,(void*)(this->blobs_[1].get()->mutable_cpu_data())); + ACLBaseLayer::tensor_mem(this->cpu().biases,(void*)(this->blobs_[1].get()->mutable_cpu_data())); } //[width, height, IFM] - this->cpu().input=new_tensor(input_shape,(void*)bottom_data); + ACLBaseLayer::new_tensor(this->cpu().input,input_shape,(void*)bottom_data); //[width, height, OFM] - this->cpu().output=new_tensor(output_shape,(void*)top_data); + ACLBaseLayer::new_tensor(this->cpu().output,output_shape,(void*)top_data); #ifdef USE_PROFILING { logtime_util log_time(ACL_CONFIG_INFO); @@ -117,14 +118,14 @@ void ACLConvolutionLayer::SetupACLLayer(const vector*>& botto #endif //USE_CONV_CACHE } } -template -void ACLConvolutionLayer::Reshape( +template +void ACLConvolutionLayer::Reshape( const vector*>& bottom, const vector*>& top) { ConvolutionLayer::Reshape(bottom, top); } -template -void ACLConvolutionLayer::Forward_cpu( +template +void ACLConvolutionLayer::Forward_cpu( const vector*>& bottom, const vector*>& top) { if(Caffe::arm_gpu_mode()){ Forward_gpu(bottom, top); @@ -162,14 +163,14 @@ void ACLConvolutionLayer::Forward_cpu( for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->cpu_data(); Dtype* top_data = top[i]->mutable_cpu_data(); - tensor_mem(this->cpu().input,(void*)bottom_data); - cpu_run(); - tensor_mem((void*)top_data,this->cpu().output); + ACLBaseLayer::tensor_mem(this->cpu().input,(void*)bottom_data); + ACLBaseLayer::cpu_run(); + ACLBaseLayer::tensor_mem((void*)top_data,this->cpu().output); } } -template -void ACLConvolutionLayer::Forward_gpu( +template +void ACLConvolutionLayer::Forward_gpu( const vector*>& bottom, const vector*>& top) { #ifdef USE_PROFILING logtime_util log_time(ACL_CONV_INFO); @@ -202,17 +203,20 @@ void ACLConvolutionLayer::Forward_gpu( for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->gpu_data(); Dtype* top_data = top[i]->mutable_gpu_data(); - tensor_mem(this->gpu().input,(void*)bottom_data); - gpu_run(); - tensor_mem((void*)top_data,this->gpu().output); + ACLBaseLayer::tensor_mem(this->gpu().input,(void*)bottom_data); + ACLBaseLayer::gpu_run(); + ACLBaseLayer::tensor_mem((void*)top_data,this->gpu().output); } } -template -ACLConvolutionLayer::~ACLConvolutionLayer() { +template +ACLConvolutionLayer::~ACLConvolutionLayer() { } -INSTANTIATE_CLASS(ACLConvolutionLayer); +#ifdef USE_ACL +INSTANTIATE_CONV_CLASS(ACLConvolutionLayer,CLConvolutionLayer,NEDirectConvolutionLayer); +INSTANTIATE_CONV_CLASS(ACLConvolutionLayer,CLConvolutionLayer,NEConvolutionLayer); +#endif } // namespace caffe #endif // USE_ACL diff --git a/src/caffe/layers/acl_batch_norm_layer.cpp b/src/caffe/layers/acl_batch_norm_layer.cpp new file mode 100644 index 0000000..b117343 --- /dev/null +++ b/src/caffe/layers/acl_batch_norm_layer.cpp @@ -0,0 +1,158 @@ +#ifdef USE_ACL +#include + +#include "caffe/layers/acl_batch_norm_layer.hpp" + +namespace caffe { + +template +void ACLBatchNormLayer::LayerSetUp(const vector*>& bottom, + const vector*>& top) { + BatchNormLayer::LayerSetUp(bottom, top); + this->force_bypass_acl_path_= bypass_acl_class_layer & FLAGS_ENABLE_ACL_BN; +} +template +void ACLBatchNormLayer::SetupACLLayer(const vector*>& bottom, + const vector*>& top){ + 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; + + TensorShape in_shape ((unsigned int)bottom[0]->width(), (unsigned int)bottom[0]->height(),(unsigned int)bottom[0]->channels(),(unsigned int)bottom[0]->num()); + TensorShape out_shape((unsigned int)top[0]->width(), (unsigned int)top[0]->height(),(unsigned int)top[0]->channels(),(unsigned int)top[0]->num()); + TensorShape mean_shape((unsigned int)this->channels_); + TensorShape var_shape=mean_shape; + TensorShape beta_shape=mean_shape; + TensorShape gamma_shape=mean_shape; + Dtype beta_val[beta_shape.total_size()]; + Dtype gamma_val[gamma_shape.total_size()]; + + + for (int i=0;imutable_gpu_data(); + const Dtype* bottom_data = bottom[0]->gpu_data(); + // use the stored mean/variance estimates. + const Dtype scale_factor = this->blobs_[2]->cpu_data()[0] == 0 ? + 0 : 1 / this->blobs_[2]->cpu_data()[0]; + caffe_cpu_scale(this->variance_.count(), scale_factor, + this->blobs_[0]->gpu_data(), this->mean_.mutable_gpu_data()); + caffe_cpu_scale(this->variance_.count(), scale_factor, + this->blobs_[1]->gpu_data(), this->variance_.mutable_gpu_data()); + new_tensor(this->gpu().input,in_shape,(void*)bottom_data); + new_tensor(this->gpu().output,out_shape,(void*)top_data); + new_tensor(this->gpu().mean,mean_shape); + new_tensor(this->gpu().var,var_shape); + new_tensor(this->gpu().beta,beta_shape); + new_tensor(this->gpu().gamma,gamma_shape); + tensor_mem(this->gpu().mean,(void*)this->mean_.mutable_gpu_data()); + tensor_mem(this->gpu().var,(void*)this->variance_.mutable_gpu_data()); + tensor_mem(this->gpu().beta,(void*)beta_val); + tensor_mem(this->gpu().gamma,(void*)gamma_val); + this->gpu().mean->commit(); + this->gpu().var->commit(); + this->gpu().beta->commit(); + this->gpu().gamma->commit(); + +#ifdef USE_PROFILING + logtime_util log_time(ACL_CONFIG_INFO); +#endif //USE_PROFILING + this->gpu().layer->configure(this->gpu().input,this->gpu().output,this->gpu().mean,this->gpu().var,this->gpu().beta,this->gpu().gamma,this->eps_); + }else{ + Dtype *top_data = top[0]->mutable_cpu_data(); + const Dtype* bottom_data = bottom[0]->cpu_data(); + // use the stored mean/variance estimates. + const Dtype scale_factor = this->blobs_[2]->cpu_data()[0] == 0 ? + 0 : 1 / this->blobs_[2]->cpu_data()[0]; + caffe_cpu_scale(this->variance_.count(), scale_factor, + this->blobs_[0]->cpu_data(), this->mean_.mutable_cpu_data()); + caffe_cpu_scale(this->variance_.count(), scale_factor, + this->blobs_[1]->cpu_data(), this->variance_.mutable_cpu_data()); + new_tensor(this->cpu().input,in_shape,(void*)bottom_data); + new_tensor(this->cpu().output,out_shape,(void*)top_data); + new_tensor(this->cpu().mean,mean_shape); + new_tensor(this->cpu().var,var_shape); + new_tensor(this->cpu().beta,beta_shape); + new_tensor(this->cpu().gamma,gamma_shape); + tensor_mem(this->cpu().mean,(void*)this->mean_.mutable_cpu_data()); + tensor_mem(this->cpu().var,(void*)this->variance_.mutable_cpu_data()); + tensor_mem(this->cpu().beta,(void*)beta_val); + tensor_mem(this->cpu().gamma,(void*)gamma_val); + this->cpu().mean->commit(); + this->cpu().var->commit(); + this->cpu().beta->commit(); + this->cpu().gamma->commit(); + +#ifdef USE_PROFILING + logtime_util log_time(ACL_CONFIG_INFO); +#endif //USE_PROFILING + this->cpu().layer->configure(this->cpu().input,this->cpu().output,this->cpu().mean,this->cpu().var,this->cpu().beta,this->cpu().gamma,this->eps_); + } +} +template +void ACLBatchNormLayer::Reshape(const vector*>& bottom, + const vector*>& top) { + BatchNormLayer::Reshape(bottom, top); + +} + +template +void ACLBatchNormLayer::Forward_cpu(const vector*>& bottom, + const vector*>& top) { + if(Caffe::arm_gpu_mode()){ + Forward_gpu(bottom, top); + return; + } + if (this->force_bypass_acl_path_||!this->use_global_stats_) { + BatchNormLayer::Forward_cpu(bottom,top); + return; + } +#ifdef USE_PROFILING + logtime_util log_time(ACL_BN_INFO); +#endif //USE_PROFILING + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); + SetupACLLayer(bottom,top); + tensor_mem(this->cpu().input,(void*)(bottom_data)); + cpu_run(); + tensor_mem((void*)(top_data),this->cpu().output); +} + +template +void ACLBatchNormLayer::Forward_gpu(const vector*>& bottom, + const vector*>& top) { + if (this->force_bypass_acl_path_||!this->use_global_stats_) { + BatchNormLayer::Forward_cpu(bottom,top); + return; + } +#ifdef USE_PROFILING + logtime_util log_time(ACL_BN_INFO); +#endif //USE_PROFILING + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); + SetupACLLayer(bottom,top); + tensor_mem(this->gpu().input,(void*)(bottom_data)); + gpu_run(); + tensor_mem((void*)(top_data),this->gpu().output); +} + +template +ACLBatchNormLayer::~ACLBatchNormLayer() { +} + +INSTANTIATE_CLASS(ACLBatchNormLayer); + +} // namespace caffe +#endif // USE_ACL diff --git a/src/caffe/layers/acl_concat_layer.cpp b/src/caffe/layers/acl_concat_layer.cpp new file mode 100644 index 0000000..f142d28 --- /dev/null +++ b/src/caffe/layers/acl_concat_layer.cpp @@ -0,0 +1,128 @@ +#ifdef USE_ACL +#include + +#include "caffe/layers/acl_concat_layer.hpp" + +namespace caffe { + +template +void ACLConcatLayer::LayerSetUp(const vector*>& bottom, + const vector*>& top) { + ConcatLayer::LayerSetUp(bottom, top); + this->force_bypass_acl_path_= bypass_acl_class_layer & FLAGS_ENABLE_ACL_CONCAT; +} +template +void ACLConcatLayer::SetupACLLayer(const vector*>& bottom, + const vector*>& top){ + + unsigned int channels=0; + for (int i = 0; i < bottom.size(); ++i) { + channels+=bottom[i]->channels(); + } + TensorShape out_shape((unsigned int)top[0]->width(), (unsigned int)top[0]->height(),channels); + + 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; + + if (Caffe::arm_gpu_mode()) { + Dtype *top_data = top[0]->mutable_gpu_data(); + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->gpu_data(); + TensorShape vec_shape((unsigned int)bottom[i]->width(), (unsigned int)bottom[i]->height(),(unsigned int)bottom[0]->channels()); + GPUTensor *vector; + new_tensor(vector,vec_shape,(void*)bottom_data); + tensor_mem(vector,(void*)bottom_data); + vector->commit(); + gpu_vectors.push_back(vector); + } + 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(gpu_vectors,this->gpu().output); + }else{ + Dtype *top_data = top[0]->mutable_cpu_data(); + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->cpu_data(); + TensorShape vec_shape((unsigned int)bottom[i]->width(), (unsigned int)bottom[i]->height(),(unsigned int)bottom[0]->channels()); + CPUTensor *vector; + new_tensor(vector,vec_shape,(void*)bottom_data); + tensor_mem(vector,(void*)bottom_data); + vector->commit(); + cpu_vectors.push_back(vector); + } + 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(cpu_vectors,this->cpu().output); + } +} +template +void ACLConcatLayer::Reshape(const vector*>& bottom, + const vector*>& top) { + ConcatLayer::Reshape(bottom, top); + +} + +template +void ACLConcatLayer::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_CONCAT_INFO); +#endif //USE_PROFILING + if (this->force_bypass_acl_path_||this->concat_axis_==0) { + ConcatLayer::Forward_cpu(bottom,top); + return; + } + + Dtype* top_data = top[0]->mutable_cpu_data(); + SetupACLLayer(bottom,top); + cpu_run(); + tensor_mem((void*)(top_data),this->cpu().output); +} + +template +void ACLConcatLayer::Forward_gpu(const vector*>& bottom, + const vector*>& top) { +#ifdef USE_PROFILING + logtime_util log_time(ACL_CONCAT_INFO); +#endif //USE_PROFILING + if (this->force_bypass_acl_path_||this->concat_axis_==0) { + ConcatLayer::Forward_cpu(bottom,top); + return; + } + Dtype* top_data = top[0]->mutable_gpu_data(); + SetupACLLayer(bottom,top); + gpu_run(); + tensor_mem((void*)(top_data),this->gpu().output); +} + +template +ACLConcatLayer::~ACLConcatLayer() { + for (int i =0; i < cpu_vectors.size(); i ++) { + delete cpu_vectors[i]; + } + for (int i =0; i < gpu_vectors.size(); i ++) { + delete gpu_vectors[i]; + } + cpu_vectors.erase(cpu_vectors.begin()); + gpu_vectors.erase(gpu_vectors.begin()); +} + +INSTANTIATE_CLASS(ACLConcatLayer); + +} // namespace caffe +#endif // USE_ACL diff --git a/src/caffe/layers/acl_inner_product_layer.cpp b/src/caffe/layers/acl_inner_product_layer.cpp index 6e7a46e..47d1011 100644 --- a/src/caffe/layers/acl_inner_product_layer.cpp +++ b/src/caffe/layers/acl_inner_product_layer.cpp @@ -39,17 +39,17 @@ void ACLInnerProductLayer::SetupACLLayer(const vector*>& bott Dtype *top_data = top[0]->mutable_gpu_data(); const Dtype* bottom_data = bottom[0]->gpu_data(); if (transpose) { - this->gpu().weights=new_tensor(weights_shape_t,(void*)(this->blobs_[0].get()->mutable_gpu_data())); + new_tensor(this->gpu().weights,weights_shape_t,(void*)(this->blobs_[0].get()->mutable_gpu_data())); }else{ - this->gpu().weights=new_tensor(weights_shape,(void*)(this->blobs_[0].get()->mutable_gpu_data())); + new_tensor(this->gpu().weights,weights_shape,(void*)(this->blobs_[0].get()->mutable_gpu_data())); } tensor_mem(this->gpu().weights,(void*)(this->blobs_[0].get()->mutable_gpu_data())); if (this->bias_term_) { - this->gpu().biases=new_tensor(biases_shape,(void*)(this->blobs_[1].get()->mutable_gpu_data())); + new_tensor(this->gpu().biases,biases_shape,(void*)(this->blobs_[1].get()->mutable_gpu_data())); tensor_mem(this->gpu().biases,(void*)(this->blobs_[1].get()->mutable_gpu_data())); } - this->gpu().input=new_tensor(input_shape,(void*)bottom_data); - this->gpu().output=new_tensor(output_shape,(void*)top_data); + new_tensor(this->gpu().input,input_shape,(void*)bottom_data); + new_tensor(this->gpu().output,output_shape,(void*)top_data); #ifdef USE_PROFILING logtime_util log_time(ACL_CONFIG_INFO); #endif //USE_PROFILING @@ -58,17 +58,17 @@ void ACLInnerProductLayer::SetupACLLayer(const vector*>& bott Dtype *top_data = top[0]->mutable_cpu_data(); const Dtype* bottom_data = bottom[0]->cpu_data(); if (transpose) { - this->cpu().weights=new_tensor(weights_shape_t,(void*)(this->blobs_[0].get()->mutable_cpu_data())); + new_tensor(this->cpu().weights,weights_shape_t,(void*)(this->blobs_[0].get()->mutable_cpu_data())); }else{ - this->cpu().weights=new_tensor(weights_shape,(void*)(this->blobs_[0].get()->mutable_cpu_data())); + new_tensor(this->cpu().weights,weights_shape,(void*)(this->blobs_[0].get()->mutable_cpu_data())); } tensor_mem(this->cpu().weights,(void*)(this->blobs_[0].get()->mutable_cpu_data())); if (this->bias_term_) { - this->cpu().biases=new_tensor(biases_shape,(void*)(this->blobs_[1].get()->mutable_cpu_data())); + new_tensor(this->cpu().biases,biases_shape,(void*)(this->blobs_[1].get()->mutable_cpu_data())); tensor_mem(this->cpu().biases,(void*)(this->blobs_[1].get()->mutable_cpu_data())); } - this->cpu().input=new_tensor(input_shape,(void*)bottom_data); - this->cpu().output=new_tensor(output_shape,(void*)top_data); + new_tensor(this->cpu().input,input_shape,(void*)bottom_data); + new_tensor(this->cpu().output,output_shape,(void*)top_data); #ifdef USE_PROFILING logtime_util log_time(ACL_CONFIG_INFO); #endif //USE_PROFILING diff --git a/src/caffe/layers/acl_local_connect_layer.cpp b/src/caffe/layers/acl_local_connect_layer.cpp new file mode 100644 index 0000000..4eed72f --- /dev/null +++ b/src/caffe/layers/acl_local_connect_layer.cpp @@ -0,0 +1,176 @@ +#ifdef USE_ACL +#include +#include + +#include "caffe/filler.hpp" +#include "caffe/layers/acl_local_connect_layer.hpp" + +namespace caffe { + +template +void ACLLocalConnectLayer::LayerSetUp( + const vector*>& bottom, const vector*>& top) { + LocalConnectLayer::LayerSetUp(bottom, top); + this->force_bypass_acl_path_= bypass_acl_class_layer & FLAGS_ENABLE_ACL_LC; +} + +template +void ACLLocalConnectLayer::SetupACLLayer(const vector*>& bottom, + const vector*>& top){ + + TensorShape input_shape((unsigned int)bottom[0]->width(), (unsigned int)bottom[0]->height(),(unsigned int)bottom[0]->channels(),(unsigned int)bottom[0]->num()); + checkreshape(input_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; + ConvolutionParameter conv_param = this->layer_param_.convolution_param(); + int stride_x =this->stride_; + int stride_y =this->stride_; + int pad_x=this->pad_; + int pad_y=this->pad_; + unsigned int kernel_x=this->kernel_size_; + unsigned int kernel_y=this->kernel_size_; + PadStrideInfo conv_info(stride_x,stride_y,pad_x,pad_y); + TensorShape weights_shape(kernel_x,kernel_y,(unsigned int)this->channels_, (unsigned int)this->num_output_); + TensorShape biases_shape ((unsigned int)this->num_output_); + TensorShape output_shape((unsigned int)top[0]->width(), (unsigned int)top[0]->height(),(unsigned int)top[0]->channels(),(unsigned int)top[0]->num()); + + if (Caffe::arm_gpu_mode()) { + Dtype *top_data = top[0]->mutable_gpu_data(); + const Dtype* bottom_data = bottom[0]->gpu_data(); + //[kernel_x, kernel_y, IFM, OFM] + new_tensor(this->gpu().weights,weights_shape,(void*)(this->blobs_[0].get()->mutable_gpu_data())); + tensor_mem(this->gpu().weights,(void*)(this->blobs_[0].get()->mutable_gpu_data())); + //[OFM] + if (this->bias_term_) { + new_tensor(this->gpu().biases,biases_shape,(void*)(this->blobs_[1].get()->mutable_gpu_data())); + tensor_mem(this->gpu().biases,(void*)(this->blobs_[1].get()->mutable_gpu_data())); + } + + //[width, height, IFM] + new_tensor(this->gpu().input,input_shape,(void*)bottom_data); + //[width, height, OFM] + new_tensor(this->gpu().output,output_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().weights,this->gpu().biases,this->gpu().output,conv_info); +#ifdef USE_PROFILING + } +#endif //USE_PROFILING +#ifdef USE_CONV_CACHE + for(int i = 0; i < 16; ++i){ + fprintf(stderr, "check cache[%d]\n", i); + if(this->gpu().cache.layer[i] == nullptr){ + this->gpu().cache.layer[i] = this->gpu().layer; + this->gpu().cache.input[i] = this->gpu().input; + this->gpu().cache.output[i] = this->gpu().output; + this->gpu().cache.weights[i] = this->gpu().weights; + this->gpu().cache.biases[i] = this->gpu().biases; + break; + } + } +#endif //USE_CONV_CACHE + }else{ + Dtype *top_data = top[0]->mutable_cpu_data(); + const Dtype* bottom_data = bottom[0]->cpu_data(); + //[kernel_x, kernel_y, IFM, OFM] + new_tensor(this->cpu().weights,weights_shape,(void*)(this->blobs_[0].get()->mutable_cpu_data())); + tensor_mem(this->cpu().weights,(void*)(this->blobs_[0].get()->mutable_cpu_data())); + //[OFM] + if (this->bias_term_) { + new_tensor(this->cpu().biases,biases_shape,(void*)(this->blobs_[1].get()->mutable_cpu_data())); + tensor_mem(this->cpu().biases,(void*)(this->blobs_[1].get()->mutable_cpu_data())); + } + + //[width, height, IFM] + new_tensor(this->cpu().input,input_shape,(void*)bottom_data); + //[width, height, OFM] + new_tensor(this->cpu().output,output_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().weights,this->cpu().biases,this->cpu().output,conv_info); +#ifdef USE_PROFILING + } +#endif //USE_PROFILING + } +} +template +void ACLLocalConnectLayer::Reshape( + const vector*>& bottom, const vector*>& top) { + LocalConnectLayer::Reshape(bottom, top); +} + +template +void ACLLocalConnectLayer::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_LC_INFO); +#endif //USE_PROFILING + if (this->force_bypass_acl_path_) { + LocalConnectLayer::Forward_cpu(bottom,top); + return; + } + + ConvolutionParameter conv_param = this->layer_param_.convolution_param(); + if (conv_param.kernel_size_size()>2 ) { + LocalConnectLayer::Forward_cpu(bottom,top); + return; + } + + SetupACLLayer(bottom,top); + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->cpu_data(); + Dtype* top_data = top[i]->mutable_cpu_data(); + tensor_mem(this->cpu().input,(void*)bottom_data); + cpu_run(); + tensor_mem((void*)top_data,this->cpu().output); + } +} + +template +void ACLLocalConnectLayer::Forward_gpu( + const vector*>& bottom, const vector*>& top) { +#ifdef USE_PROFILING + logtime_util log_time(ACL_LC_INFO); +#endif //USE_PROFILING + ConvolutionParameter conv_param = this->layer_param_.convolution_param(); + if (this->force_bypass_acl_path_) { + LocalConnectLayer::Forward_cpu(bottom,top); + return; + } + if (conv_param.kernel_size_size()>2 ) { + LocalConnectLayer::Forward_cpu(bottom,top); + return; + } + SetupACLLayer(bottom,top); + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->gpu_data(); + Dtype* top_data = top[i]->mutable_gpu_data(); + tensor_mem(this->gpu().input,(void*)bottom_data); + gpu_run(); + tensor_mem((void*)top_data,this->gpu().output); + } +} + +template +ACLLocalConnectLayer::~ACLLocalConnectLayer() { +} + +INSTANTIATE_CLASS(ACLLocalConnectLayer); + +} // namespace caffe +#endif // USE_ACL diff --git a/src/caffe/layers/acl_lrn_layer.cpp b/src/caffe/layers/acl_lrn_layer.cpp index 6e5c7bc..db9630d 100644 --- a/src/caffe/layers/acl_lrn_layer.cpp +++ b/src/caffe/layers/acl_lrn_layer.cpp @@ -36,8 +36,8 @@ void ACLLRNLayer::SetupACLLayer(const vector*>& bottom, if (Caffe::arm_gpu_mode()) { Dtype *top_data = top[0]->mutable_gpu_data(); const Dtype* bottom_data = bottom[0]->gpu_data(); - this->gpu().input=new_tensor(shape,(void*)bottom_data); - this->gpu().output=new_tensor(shape,(void*)top_data); + new_tensor(this->gpu().input,shape,(void*)bottom_data); + new_tensor(this->gpu().output,shape,(void*)top_data); #ifdef USE_PROFILING logtime_util log_time(ACL_CONFIG_INFO); #endif //USE_PROFILING @@ -45,8 +45,8 @@ void ACLLRNLayer::SetupACLLayer(const vector*>& bottom, }else{ Dtype *top_data = top[0]->mutable_cpu_data(); const Dtype* bottom_data = bottom[0]->cpu_data(); - this->cpu().input=new_tensor(shape,(void*)bottom_data); - this->cpu().output=new_tensor(shape,(void*)top_data); + new_tensor(this->cpu().input,shape,(void*)bottom_data); + new_tensor(this->cpu().output,shape,(void*)top_data); #ifdef USE_PROFILING logtime_util log_time(ACL_CONFIG_INFO); #endif //USE_PROFILING diff --git a/src/caffe/layers/acl_pooling_layer.cpp b/src/caffe/layers/acl_pooling_layer.cpp index 951de3e..eb1c5da 100644 --- a/src/caffe/layers/acl_pooling_layer.cpp +++ b/src/caffe/layers/acl_pooling_layer.cpp @@ -37,8 +37,8 @@ void ACLPoolingLayer::SetupACLLayer(const vector*>& bottom, if (Caffe::arm_gpu_mode()) { Dtype *top_data = top[0]->mutable_gpu_data(); const Dtype* bottom_data = bottom[0]->gpu_data(); - this->gpu().input=new_tensor(in_shape,(void*)bottom_data); - this->gpu().output=new_tensor(out_shape,(void*)top_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 @@ -46,8 +46,8 @@ void ACLPoolingLayer::SetupACLLayer(const vector*>& bottom, }else{ Dtype *top_data = top[0]->mutable_cpu_data(); const Dtype* bottom_data = bottom[0]->cpu_data(); - this->cpu().input=new_tensor(in_shape,(void*)bottom_data); - this->cpu().output=new_tensor(out_shape,(void*)top_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 @@ -72,7 +72,7 @@ void ACLPoolingLayer::Forward_cpu(const vector*>& bottom, #ifdef USE_PROFILING logtime_util log_time(ACL_POOLING_INFO); #endif //USE_PROFILING - if (this->force_bypass_acl_path_) { + if (this->force_bypass_acl_path_|| this->layer_param_.pooling_param().global_pooling()) { PoolingLayer::Forward_cpu(bottom,top); return; } @@ -109,7 +109,7 @@ void ACLPoolingLayer::Forward_gpu(const vector*>& bottom, #ifdef USE_PROFILING logtime_util log_time(ACL_POOLING_INFO); #endif //USE_PROFILING - if (this->force_bypass_acl_path_) { + if (this->force_bypass_acl_path_|| this->layer_param_.pooling_param().global_pooling()) { PoolingLayer::Forward_cpu(bottom,top); return; } diff --git a/src/caffe/layers/acl_softmax_layer.cpp b/src/caffe/layers/acl_softmax_layer.cpp index d32460b..1568d3a 100644 --- a/src/caffe/layers/acl_softmax_layer.cpp +++ b/src/caffe/layers/acl_softmax_layer.cpp @@ -33,8 +33,8 @@ void ACLSoftmaxLayer::SetupACLLayer(const vector*>& bottom, if (Caffe::arm_gpu_mode()) { Dtype *top_data = top[0]->mutable_gpu_data(); const Dtype* bottom_data = bottom[0]->gpu_data(); - this->gpu().input=new_tensor(shape,(void*)bottom_data); - this->gpu().output=new_tensor(shape,(void*)top_data); + new_tensor(this->gpu().input,shape,(void*)bottom_data); + new_tensor(this->gpu().output,shape,(void*)top_data); #ifdef USE_PROFILING logtime_util log_time(ACL_CONFIG_INFO); #endif //USE_PROFILING @@ -42,8 +42,8 @@ void ACLSoftmaxLayer::SetupACLLayer(const vector*>& bottom, }else{ Dtype *top_data = top[0]->mutable_cpu_data(); const Dtype* bottom_data = bottom[0]->cpu_data(); - this->cpu().input=new_tensor(shape,(void*)bottom_data); - this->cpu().output=new_tensor(shape,(void*)top_data); + new_tensor(this->cpu().input,shape,(void*)bottom_data); + new_tensor(this->cpu().output,shape,(void*)top_data); #ifdef USE_PROFILING logtime_util log_time(ACL_CONFIG_INFO); #endif //USE_PROFILING diff --git a/src/caffe/layers/batch_norm_layer.cpp b/src/caffe/layers/batch_norm_layer.cpp index 0a08ed4..d3bf487 100644 --- a/src/caffe/layers/batch_norm_layer.cpp +++ b/src/caffe/layers/batch_norm_layer.cpp @@ -247,5 +247,7 @@ STUB_GPU(BatchNormLayer); #endif INSTANTIATE_CLASS(BatchNormLayer); +#ifndef USE_ACL REGISTER_LAYER_CLASS(BatchNorm); +#endif } // namespace caffe diff --git a/src/caffe/layers/concat_layer.cpp b/src/caffe/layers/concat_layer.cpp index 580bd47..9c20076 100644 --- a/src/caffe/layers/concat_layer.cpp +++ b/src/caffe/layers/concat_layer.cpp @@ -99,6 +99,8 @@ STUB_GPU(ConcatLayer); #endif INSTANTIATE_CLASS(ConcatLayer); +#ifndef USE_ACL REGISTER_LAYER_CLASS(Concat); +#endif } // namespace caffe diff --git a/src/caffe/layers/local_connect_layer.cpp b/src/caffe/layers/local_connect_layer.cpp new file mode 100644 index 0000000..6996191 --- /dev/null +++ b/src/caffe/layers/local_connect_layer.cpp @@ -0,0 +1,212 @@ +#include + +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/util/im2col.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/layers/local_connect_layer.hpp" + +namespace caffe { + +template +void LocalConnectLayer::LayerSetUp(const vector*>& bottom, + const vector*>& top) { + CHECK_EQ(bottom.size(), 1) << "Conv Layer takes a single blob as input."; + CHECK_EQ(top.size(), 1) << "Conv Layer takes a single blob as output."; + + kernel_size_ = this->layer_param_.local_param().kernel_size(); + stride_ = this->layer_param_.local_param().stride(); + pad_ = this->layer_param_.local_param().pad(); + num_ = bottom[0]->num(); + channels_ = bottom[0]->channels(); + height_ = bottom[0]->height(); + width_ = bottom[0]->width(); + num_output_ = this->layer_param_.local_param().num_output(); + dilation_=1; + + height_out_ = (height_ + 2 * pad_ - kernel_size_) / stride_ + 1; + width_out_ = (width_ + 2 * pad_ - kernel_size_) / stride_ + 1; + + M_ = num_output_; + K_ = channels_ * kernel_size_ * kernel_size_; + N_ = height_out_ * width_out_; + + CHECK_GT(num_output_, 0); + CHECK_GE(height_, kernel_size_) << "height smaller than kernel size"; + CHECK_GE(width_, kernel_size_) << "width smaller than kernel size"; + // Set the parameters + bias_term_ = this->layer_param_.local_param().bias_term(); + + // Check if we need to set up the weights + if (this->blobs_.size() > 0) { + LOG(INFO) << "Skipping parameter initialization"; + } else { + if (bias_term_) { + this->blobs_.resize(2); + } else { + this->blobs_.resize(1); + } + // Intialize the weight + this->blobs_[0].reset(new Blob( + num_output_, 1, K_, N_)); + // fill the weights + shared_ptr > weight_filler(GetFiller( + this->layer_param_.local_param().weight_filler())); + weight_filler->Fill(this->blobs_[0].get()); + // If necessary, intiialize and fill the bias term + if (bias_term_) { + this->blobs_[1].reset(new Blob(1, 1, M_, N_)); + shared_ptr > bias_filler(GetFiller( + this->layer_param_.local_param().bias_filler())); + bias_filler->Fill(this->blobs_[1].get()); + } + } +} + +template +void LocalConnectLayer::Reshape(const vector*>& bottom, + const vector*>& top) { + CHECK_EQ(bottom[0]->channels(), channels_) << "Input size incompatible with" + " weights."; + // TODO: generalize to handle inputs of different shapes. + for (int bottom_id = 1; bottom_id < bottom.size(); ++bottom_id) { + CHECK_EQ(num_, bottom[bottom_id]->num()) << "Inputs must have same num."; + CHECK_EQ(channels_, bottom[bottom_id]->channels()) + << "Inputs must have same channels."; + CHECK_EQ(height_, bottom[bottom_id]->height()) + << "Inputs must have same height."; + CHECK_EQ(width_, bottom[bottom_id]->width()) + << "Inputs must have same width."; + } + + // Shape the tops. + for (int top_id = 0; top_id < top.size(); ++top_id) { + top[top_id]->Reshape(num_, num_output_, height_out_, width_out_); + } + + // The im2col result buffer would only hold one image at a time to avoid + // overly large memory usage. + col_buffer_.Reshape( + 1, channels_ * kernel_size_ * kernel_size_, height_out_, width_out_); + + for (int top_id = 0; top_id < top.size(); ++top_id) { + top[top_id]->Reshape(num_, num_output_, height_out_, width_out_); + } +} + +template +void LocalConnectLayer::Forward_cpu(const vector*>& bottom, + const vector*>& top) { + + Dtype* x_data = col_buffer_.mutable_cpu_data(); + const Dtype* weight = this->blobs_[0]->cpu_data(); + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); + + Blob E; + E.Reshape(1, 1, 1, K_); + FillerParameter filler_param; + filler_param.set_value(1); + ConstantFiller filler(filler_param); + filler.Fill(&E); + + Blob intermediate; + intermediate.Reshape(1, 1, K_, N_); + for (int n=0; noffset(n), channels_, height_, + width_, kernel_size_, kernel_size_, pad_, pad_, stride_, stride_,dilation_,dilation_, x_data); + + for (int m=0; mblobs_[0]->offset(m), + intermediate.mutable_cpu_data()); + + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, 1, N_, K_, + (Dtype)1., E.cpu_data(), + intermediate.cpu_data(), + (Dtype)0., top_data + top[0]->offset(n, m)); + } + + if (bias_term_) { + caffe_add(M_ * N_, this->blobs_[1]->cpu_data(), + top_data + top[0]->offset(n), + top_data + top[0]->offset(n)); + } + } +} + +template +void LocalConnectLayer::Backward_cpu(const vector*>& top, + const vector& propagate_down, const vector*>& bottom) { + + const Dtype* top_diff = top[0]->cpu_diff(); + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + Dtype* x_data = col_buffer_.mutable_cpu_data(); + Dtype* x_diff = col_buffer_.mutable_cpu_diff(); + const Dtype* weight = this->blobs_[0]->cpu_data(); + Dtype* weight_diff = this->blobs_[0]->mutable_cpu_diff(); + Dtype* bias_diff = NULL; + + Blob intermediate; + intermediate.Reshape(1, 1, 1, N_); + + Blob xt; + xt.Reshape(1, 1, K_, N_); + Dtype* xt_data = xt.mutable_cpu_data(); + + if (bias_term_) { + bias_diff = this->blobs_[1]->mutable_cpu_diff(); + memset(bias_diff, 0, sizeof(Dtype) * this->blobs_[1]->count()); + for (int n = 0; n < num_; ++n) { + caffe_add(M_ * N_, bias_diff, + top_diff + top[0]->offset(n), + bias_diff); + } + } + + memset(weight_diff, 0, sizeof(Dtype) * this->blobs_[0]->count()); + for (int n=0; noffset(n), channels_, height_, + width_, kernel_size_, kernel_size_, pad_, pad_, stride_, stride_, dilation_,dilation_,x_data); + + // gradient wrt weight + for (int m=0; mblobs_[0]->offset(m); + for (int k=0; koffset(n, m), + x_data+col_buffer_.offset(0,k), xt_data+xt.offset(0,0,k)); + } + caffe_cpu_axpby(K_*N_, Dtype(1.0), xt_data, Dtype(1.0), filter_weight_diff); + } + + // gradient wrt bottom data + if (propagate_down[0]) { + memset(x_diff, 0, col_buffer_.count() * sizeof(Dtype)); + for (int m=0; moffset(n, m), + weight+this->blobs_[0]->offset(m,0,k), + intermediate.mutable_cpu_data()); + + caffe_cpu_axpby(N_, Dtype(1.0), + intermediate.cpu_data(), Dtype(1.0), + x_diff+col_buffer_.offset(0,k)); + } + } + + // col2im back to the data + col2im_cpu(x_diff, channels_, height_, width_, kernel_size_, kernel_size_, + pad_, pad_, stride_, stride_, dilation_,dilation_,bottom_diff + bottom[0]->offset(n)); + + } + } + +} + +#ifdef CPU_ONLY +STUB_GPU(LocalConnectLayer); +#endif + +INSTANTIATE_CLASS(LocalConnectLayer); + +} // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 02e0ddf..17bcd24 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -308,7 +308,7 @@ message ParamSpec { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available layer-specific ID: 147 (last added: recurrent_param) +// LayerParameter next available layer-specific ID: 148 (last added: recurrent_param) message LayerParameter { optional string name = 1; // the layer name optional string type = 2; // the layer type @@ -405,6 +405,7 @@ message LayerParameter { optional ThresholdParameter threshold_param = 128; optional TileParameter tile_param = 138; optional WindowDataParameter window_data_param = 129; + optional LocalParameter local_param = 147; } // Message that stores parameters used to apply transformation @@ -620,6 +621,17 @@ message ConvolutionParameter { optional bool force_nd_im2col = 17 [default = false]; } +// Message that stores parameters used by LocalLayer +message LocalParameter { + optional uint32 num_output = 1; // The number of outputs for the layer + optional bool bias_term = 2 [default = true]; // whether to have bias terms + optional uint32 pad = 3 [default = 0]; // The padding size + optional uint32 kernel_size = 4; // The kernel size + optional uint32 stride = 6 [default = 1]; // The stride + optional FillerParameter weight_filler = 7; // The filler for the weight + optional FillerParameter bias_filler = 8; // The filler for the bias +} + message CropParameter { // To crop, elements of the first bottom are selected to fit the dimensions // of the second, reference bottom. The crop is configured by @@ -1263,6 +1275,7 @@ message V1LayerParameter { TANH = 23; WINDOW_DATA = 24; THRESHOLD = 31; + LOCALCONNECT = 40; } optional LayerType type = 5; repeated BlobProto blobs = 6; diff --git a/tools/extra/extract_seconds.py b/tools/extra/extract_seconds.py old mode 100755 new mode 100644 diff --git a/tools/extra/launch_resize_and_crop_images.sh b/tools/extra/launch_resize_and_crop_images.sh old mode 100755 new mode 100644 diff --git a/tools/extra/parse_log.py b/tools/extra/parse_log.py old mode 100755 new mode 100644 diff --git a/tools/extra/parse_log.sh b/tools/extra/parse_log.sh old mode 100755 new mode 100644 diff --git a/tools/extra/plot_training_log.py.example b/tools/extra/plot_training_log.py.example old mode 100755 new mode 100644 diff --git a/tools/extra/resize_and_crop_images.py b/tools/extra/resize_and_crop_images.py old mode 100755 new mode 100644 diff --git a/tools/extra/summarize.py b/tools/extra/summarize.py old mode 100755 new mode 100644 diff --git a/unit_tests/Makefile b/unit_tests/Makefile index 657d088..034ee02 100644 --- a/unit_tests/Makefile +++ b/unit_tests/Makefile @@ -1,71 +1,87 @@ -CC = gcc -CXX = g++ -ifeq ($(ACL_ROOT),) -$(error ACL_ROOT does not specified. use "export ACL_ROOT='path of acl soure directory'") -endif - -ifeq ($(CAFFE_ROOT),) -$(error CAFFE_ROOT does not specified. use "export CAFFE_ROOT='path of caffe soure directory'") -endif +include ../Makefile.config -include $(CAFFE_ROOT)/Makefile.config +CXX_SRCS+=test_pooling_layer.cpp +CXX_SRCS+=test_softmax_layer.cpp +CXX_SRCS+= test_inner_product_layer.cpp +CXX_SRCS+=test_neuron_layer.cpp +CXX_SRCS+=test_lrn_layer.cpp #failed on single channel LRN +#C_SRCS=pmu.c testbed.c +CXX_SRCS+= test_convolution_layer.cpp +#CXX_SRCS= test_fail.cpp +BIN_SRCS=test_caffe_main.cpp test.cpp +HOME=/home/firefly # # caffe related stuff # + +CAFFE_ROOT=$(HOME)/caffeOnACL CAFFE_INCS = -I$(CAFFE_ROOT)/include -I$(CAFFE_ROOT)/distribute/include/ CAFFE_LIBS = -L$(CAFFE_ROOT)/distribute/lib -lcaffe -lglog -lgflags -lprotobuf -lboost_system -lboost_filesystem +CAFFE_RPATH =$(CAFFE_ROOT)/distribute/lib + # # google test related stuff # -GTEST_ROOT = /usr/local -GTEST_INCS = -I$(GTEST_ROOT)/include/ -GTEST_LIBS = -L$(GTEST_ROOT)/lib/ -lgtest_main -lgtest + +GTEST_ROOT=/usr/local +GTEST_LIBS=$(GTEST_ROOT)/lib/libgtest_main.a $(GTEST_ROOT)/lib/libgtest.a +GTEST_INCS=-I$(GTEST_ROOT)/include/ + # # arm compute # -ACL_LIBS = -L$(ACL_ROOT)/build -L$(ACL_ROOT)/build/arm_compute -larm_compute -lOpenCL -COMM_CFLAGS = -Wall -g -DCPU_ONLY -DUSE_ACL $(GTEST_INCS) $(CAFFE_INCS) +ACL_ROOT=$(HOME)/ComputeLibrary +ACL_LIBS=-L$(ACL_ROOT)/build -L$(ACL_ROOT)/build/arm_compute -larm_compute -lOpenCL +ACL_RPATH=$(ACL_ROOT)/build:$(ACL_ROOT)/build/arm_compute +COMM_CFLAGS=$(GTEST_INCS) $(CAFFE_INCS) -Wall -g -DCPU_ONLY -DUSE_ACL #USE_PROFILING -- get profiling informations, is controled by LOGACL #LAYER_PERF_STAT -- haitao's net profiling information ifeq ($(USE_PROFILING), 1) COMM_CFLAGS += -DUSE_PROFILING -DLAYER_PERF_STAT endif -CXXFLAGS = $(COMM_CFLAGS) -Wno-sign-compare -CFLAGS = $(COMM_CFLAGS) +CXXFLAGS=$(COMM_CFLAGS) -Wno-sign-compare +CFLAGS=$(COMM_CFLAGS) -LDFLAGS += $(CAFFE_LIBS) $(GTEST_LIBS) $(ACL_LIBS) -lpthread -lopenblas +CC=gcc +CXX=g++ -COMM_OBJS += test_pooling_layer.o -COMM_OBJS += test_softmax_layer.o -COMM_OBJS += test_inner_product_layer.o -COMM_OBJS += test_neuron_layer.o -COMM_OBJS += test_lrn_layer.o -COMM_OBJS += test_convolution_layer.o +COMM_OBJS=$(CXX_SRCS:.cpp=.o) $(C_SRCS:.c=.o) +BIN_OBJS+=$(BIN_SRCS:.cpp=.o) +BIN_EXES=$(BIN_OBJS:.o=) + +LIBS+=$(CAFFE_LIBS) $(GTEST_LIBS) -lpthread -lopenblas $(ACL_LIBS) + +RT_PATH=-Wl,-rpath,$(CAFFE_RPATH):$(ACL_RPATH) + +LDFLAGS+=$(RT_PATH) -BIN_EXES = test test_caffe_main all : $(BIN_EXES) -test : test.o $(COMM_OBJS) - $(CXX) $< $(COMM_OBJS) -o $@ $(LDFLAGS) +$(BIN_EXES):%:%.o + +$(BIN_EXES):$(COMM_OBJS) + -test_caffe_main : test_caffe_main.o $(COMM_OBJS) - $(CXX) $< $(COMM_OBJS) -o $@ $(LDFLAGS) clean: - $(RM) $(BIN_EXES) *.o *.so + rm -f $(BIN_EXES) *.o *.so .PHONY : all clean %.o : %.c - $(CC) -c $(CFLAGS) $< -o $@ + $(CC) $(CFLAGS) -c $< -o $@ %.o : %.cpp - $(CXX) -c $(CXXFLAGS) $< -o $@ + $(CXX) $(CXXFLAGS) -c $< -o $@ + +%: %.o + $(CXX) $(LDFLAGS) $< $(COMM_OBJS) -o $@ $(LIBS) + -- 2.7.4