1 #include "caffe2/operators/pool_op.h" 2 #include "caffe2/mobile/contrib/arm-compute/core/context.h" 3 #include "caffe2/mobile/contrib/arm-compute/core/operator.h" 16 bool RunOnDeviceWithOrderNCHW()
override;
17 bool RunOnDeviceWithOrderNHWC()
override;
19 arm_compute::GCPoolingLayer pooling_layer_;
20 bool first_run_ =
true, second_run_ =
true;
21 GLContext::deleted_unique_ptr<const GLTensor<T>> X_;
33 bool RunOnDeviceWithOrderNCHW()
override;
34 bool RunOnDeviceWithOrderNHWC()
override;
36 arm_compute::GCPoolingLayer pooling_layer_;
37 bool first_run_ =
true, second_run_ =
true;
38 GLContext::deleted_unique_ptr<const GLTensor<T>> X_;
44 auto *Xblob = OperatorBase::Inputs()[0];
46 X_ = GLContext::getGLTensor<half>(Xblob);
50 int channels = X_->dim32(1);
51 int height = X_->dim32(2);
52 int width = X_->dim32(3);
55 OperatorBase::Outputs()[0]->template GetMutable<GLTensor<half>>();
58 CAFFE_ENFORCE_EQ(kernel_.size(), 2,
"ARM OpenGL only supports 2D pooling");
59 CAFFE_ENFORCE_EQ(kernel_h(), kernel_w(),
60 "ARM OpenGL only supports equal kernel size");
61 if (global_pooling_) {
62 vector<TIndex> output_dims = {N, channels, 1, 1};
63 Y->Resize(output_dims);
65 vector<TIndex> output_dims = {N, channels, 0, 0};
66 output_dims[2] = (height + pad_t() + pad_b() - kernel_h()) / stride_h() + 1;
67 output_dims[3] = (width + pad_l() + pad_r() - kernel_w()) / stride_w() + 1;
68 Y->Resize(output_dims);
70 if (global_pooling_) {
71 arm_compute::PoolingLayerInfo info(arm_compute::PoolingType::AVG);
72 pooling_layer_.configure(X_->get_underlying(), Y->get_underlying(), info);
74 arm_compute::PadStrideInfo ps_info(stride_w(), stride_h(), pad_l(), pad_r(),
76 arm_compute::DimensionRoundingType::FLOOR);
77 arm_compute::PoolingLayerInfo info(arm_compute::PoolingType::AVG, kernel_h(),
79 pooling_layer_.configure(X_->get_underlying(), Y->get_underlying(), info);
82 X_->lazy_allocate(Xblob, second_run_,
true);
95 auto *Xblob = OperatorBase::Inputs()[0];
97 X_ = GLContext::getGLTensor<half>(Xblob);
100 int N = X_->dim32(0);
101 int channels = X_->dim32(1);
102 int height = X_->dim32(2);
103 int width = X_->dim32(3);
106 OperatorBase::Outputs()[0]->template GetMutable<GLTensor<half>>();
110 CAFFE_ENFORCE_EQ(kernel_.size(), 2,
"ARM OpenGL only supports 2D pooling");
111 CAFFE_ENFORCE_EQ(kernel_h(), kernel_w(),
112 "ARM OpenGL only supports equal kernel size");
113 if (global_pooling_) {
114 vector<TIndex> output_dims = {N, channels, 1, 1};
115 Y->Resize(output_dims);
117 vector<int> output_dims = {1, 0, 0, 0};
118 output_dims[1] = channels;
119 output_dims[2] = (height + pad_t() + pad_b() - kernel_h()) / stride_h() + 1;
120 output_dims[3] = (width + pad_l() + pad_r() - kernel_w()) / stride_w() + 1;
121 Y->Resize(output_dims);
123 if (global_pooling_) {
124 arm_compute::PoolingLayerInfo info(arm_compute::PoolingType::MAX);
125 pooling_layer_.configure(X_->get_underlying(), Y->get_underlying(), info);
127 arm_compute::PadStrideInfo ps_info(stride_w(), stride_h(), pad_l(), pad_r(),
129 arm_compute::DimensionRoundingType::FLOOR);
130 arm_compute::PoolingLayerInfo info(arm_compute::PoolingType::MAX, kernel_h(),
132 pooling_layer_.configure(X_->get_underlying(), Y->get_underlying(), info);
135 X_->lazy_allocate(Xblob, second_run_,
true);
140 pooling_layer_.run();
Workspace is a class that holds all the related objects created during runtime: (1) all blobs...
A global dictionary that holds information about what Caffe2 modules have been loaded in the current ...