21#include <nonius/nonius.h++>
23#include <arm_compute/core/Types.h>
24#include <arm_compute/runtime/NEON/NEScheduler.h>
25#include <arm_compute/runtime/NEON/NEFunctions.h>
48TensorInfo make_info(uint32_t N)
51 return TensorInfo{shape, 1, DataType::F32};
54template <enum Layout> TensorInfo make_info(uint32_t N, uint32_t C, uint32_t H, uint32_t W);
56template <> TensorInfo make_info<NCHW>(uint32_t N, uint32_t C, uint32_t H, uint32_t W)
59 TensorInfo
info{shape, 1, DataType::F32};
60 info.set_data_layout(DataLayout::NCHW);
64template <> TensorInfo make_info<NHWC>(uint32_t N, uint32_t C, uint32_t H, uint32_t W)
67 TensorInfo
info{shape, 1, DataType::F32};
68 info.set_data_layout(DataLayout::NHWC);
72inline void check(
const Status &status)
76 std::cerr << status.error_description() << std::endl;
77 throw std::runtime_error{
"ERROR"};
81inline bool is_odd(uint32_t n) {
return (n % 2 != 0) ? true :
false; }
129 uint32_t vertical_stride;
130 uint32_t horizontal_stride;
132 PadStrideInfo deconv_info;
134 uint32_t inner_border_right;
135 uint32_t inner_border_top;
137 Configuration(nonius::chronometer
meter)
139 ifm_N =
meter.param<BATCH>();
140 ifm_C =
meter.param<IFM_C>();
141 ifm_H =
meter.param<IFM_H>();
142 ifm_W =
meter.param<IFM_W>();
144 ofm_N =
meter.param<BATCH>();
145 ofm_C =
meter.param<OFM_C>();
146 ofm_H =
meter.param<OFM_H>();
147 ofm_W =
meter.param<OFM_W>();
149 ker_N =
meter.param<OFM_C>();
150 ker_C =
meter.param<IFM_C>();
151 ker_H =
meter.param<KER_H>();
152 ker_W =
meter.param<KER_W>();
154 vertical_stride =
meter.param<STRIDE_H>();
155 horizontal_stride =
meter.param<STRIDE_W>();
160 vertical_stride, horizontal_stride, ker_H, ker_W);
162 inner_border_right = padding_info.right - padding_info.left;
163 inner_border_top = padding_info.bottom - padding_info.top;
165 padding_info.left = padding_info.right;
166 padding_info.top = padding_info.bottom;
168 deconv_info =
asPadStrideInfo(padding_info, vertical_stride, horizontal_stride);
171 template <Layout L> TensorInfo src_info()
const
173 return make_info<L>(ifm_N, ifm_C, ifm_H, ifm_W);
175 template <Layout L> TensorInfo dst_info()
const
177 return make_info<L>(ofm_N, ofm_C, ofm_H, ofm_W);
179 template <Layout L> TensorInfo ker_info()
const
181 return make_info<L>(ker_N, ker_C, ker_H, ker_W);
183 TensorInfo bias_info(
void)
const {
return make_info(ker_N); }
194inline nonius::benchmark_registry &local_benchmark_registry()
196 static nonius::benchmark_registry registry;
202#define NONIUS_LOCAL_BENCHMARK(name, ...) \
205 static ::nonius::benchmark_registrar \
206 NONIUS_DETAIL_UNIQUE_NAME(benchmark_registrar)(local_benchmark_registry(), name, __VA_ARGS__); \
210 NEDeconvolutionLayer deconv;
226 p.deconv_info,
p.inner_border_right,
p.inner_border_top));
230 meter.measure([&](
int) {
239 p.inner_border_right,
p.inner_border_top);
246 meter.measure([&](
int) { deconv.run(); });
250 NEDeconvolutionLayer deconv;
266 p.deconv_info,
p.inner_border_right,
p.inner_border_top));
270 meter.measure([&](
int) {
279 p.inner_border_right,
p.inner_border_top);
286 meter.measure([&](
int) { deconv.run(); });
291 return local_benchmark_registry();
volatile const char info[]
::nncc::core::ADT::tensor::Shape TensorShape
PadStrideInfo asPadStrideInfo(const PaddingInfo &padding, uint32_t vertical_stride, uint32_t horizontal_stride)
PaddingInfo calculatePadding(const std::string &padding_name, const uint32_t ifm_H, const uint32_t ifm_W, const uint32_t ofm_H, const uint32_t ofm_W, const uint32_t vertical_stride, const uint32_t horizontal_stride, const uint32_t ker_H, const uint32_t ker_W)