ONE - On-device Neural Engine
Loading...
Searching...
No Matches
PALAveragePool2D.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2024 Samsung Electronics Co., Ltd. All Rights Reserved
3 * Copyright 2020 The TensorFlow Authors. All Rights Reserved.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#ifndef ONERT_MICRO_EXECUTE_PAL_AVERAGE_POOL_2D_H
19#define ONERT_MICRO_EXECUTE_PAL_AVERAGE_POOL_2D_H
20
21#include "PALAveragePool2DCommon.h"
22
23#include <arm_nnfunctions.h>
24
25namespace onert_micro
26{
27namespace execute
28{
29namespace pal
30{
31
33 const int8_t *input_data, const core::OMRuntimeShape &output_shape,
34 int8_t *output_data)
35{
36 cmsis_nn_dims input_dims;
37 cmsis_nn_dims output_dims;
38 cmsis_nn_pool_params pool_params;
39 cmsis_nn_dims filter_dims;
40 cmsis_nn_context ctx;
41
42 const int depth = input_shape.dims(3);
43 const int output_width = output_shape.dims(2);
44
45 input_dims.n = 1;
46 input_dims.h = input_shape.dims(1);
47 input_dims.w = input_shape.dims(2);
48 input_dims.c = depth;
49
50 output_dims.n = 1;
51 output_dims.h = output_shape.dims(1);
52 output_dims.w = output_width;
53 output_dims.c = depth;
54
55 pool_params.stride.h = params.stride_h;
56 pool_params.stride.w = params.stride_w;
57 pool_params.padding.h = params.pad_h;
58 pool_params.padding.w = params.pad_w;
59 pool_params.activation.min = params.quantized_activation_min;
60 pool_params.activation.max = params.quantized_activation_max;
61
62 filter_dims.n = 1;
63 filter_dims.h = params.filter_h;
64 filter_dims.w = params.filter_w;
65 filter_dims.c = 1;
66
67 const int32_t buffer_size = arm_avgpool_s8_get_buffer_size(output_width, depth);
68 int8_t *buffer = nullptr;
69 if (buffer_size > 0)
70 {
71 buffer = new int8_t[buffer_size];
72 }
73
74 ctx.buf = buffer;
75 ctx.size = buffer_size;
76
77 auto res = arm_avgpool_s8(&ctx, &pool_params, &input_dims, input_data, &filter_dims, &output_dims,
78 output_data);
79
80 if (buffer_size > 0)
81 delete[] buffer;
82
83 assert(res == ARM_CMSIS_NN_SUCCESS);
84 if (res != ARM_CMSIS_NN_SUCCESS)
85 return CmsisNNError;
86
87 return Ok;
88}
89
90} // namespace pal
91} // namespace execute
92} // namespace onert_micro
93
94#endif // ONERT_MICRO_EXECUTE_PAL_AVERAGE_POOL_2D_H
int32_t dims(int i) const
Definition Tensor.h:108
const luci_interpreter::RuntimeShape output_shape
OMStatus AveragePool(const core::Pool2DParams &params, const core::OMRuntimeShape &input_shape, const int8_t *input_data, const core::OMRuntimeShape &output_shape, int8_t *output_data)