21#include <nonius/nonius.h++>
23#include <arm_compute/core/Types.h>
24#include <arm_compute/runtime/CL/CLScheduler.h>
25#include <arm_compute/runtime/CL/CLFunctions.h>
51 Initializer() { CLScheduler::get().default_init(); }
54Initializer initializer;
56TensorInfo make_info(uint32_t N)
59 return TensorInfo{shape, 1, DataType::F32};
62template <enum Layout> TensorInfo make_info(uint32_t N, uint32_t C, uint32_t H, uint32_t W);
64template <> TensorInfo make_info<NCHW>(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::NCHW);
72template <> TensorInfo make_info<NHWC>(uint32_t N, uint32_t C, uint32_t H, uint32_t W)
75 TensorInfo
info{shape, 1, DataType::F32};
76 info.set_data_layout(DataLayout::NHWC);
80inline void check(
const Status &status)
84 std::cerr << status.error_description() << std::endl;
85 throw std::runtime_error{
"ERROR"};
89inline bool is_odd(uint32_t n) {
return (n % 2 != 0) ? true :
false; }
137 uint32_t vertical_stride;
138 uint32_t horizontal_stride;
140 PadStrideInfo deconv_info;
142 uint32_t inner_border_right;
143 uint32_t inner_border_top;
145 Configuration(nonius::chronometer
meter)
147 ifm_N =
meter.param<BATCH>();
148 ifm_C =
meter.param<IFM_C>();
149 ifm_H =
meter.param<IFM_H>();
150 ifm_W =
meter.param<IFM_W>();
152 ofm_N =
meter.param<BATCH>();
153 ofm_C =
meter.param<OFM_C>();
154 ofm_H =
meter.param<OFM_H>();
155 ofm_W =
meter.param<OFM_W>();
157 ker_N =
meter.param<OFM_C>();
158 ker_C =
meter.param<IFM_C>();
159 ker_H =
meter.param<KER_H>();
160 ker_W =
meter.param<KER_W>();
162 vertical_stride =
meter.param<STRIDE_H>();
163 horizontal_stride =
meter.param<STRIDE_W>();
168 vertical_stride, horizontal_stride, ker_H, ker_W);
170 inner_border_right = padding_info.right - padding_info.left;
171 inner_border_top = padding_info.bottom - padding_info.top;
173 padding_info.left = padding_info.right;
174 padding_info.top = padding_info.bottom;
176 deconv_info =
asPadStrideInfo(padding_info, vertical_stride, horizontal_stride);
179 template <Layout L> TensorInfo src_info()
const
181 return make_info<L>(ifm_N, ifm_C, ifm_H, ifm_W);
183 template <Layout L> TensorInfo dst_info()
const
185 return make_info<L>(ofm_N, ofm_C, ofm_H, ofm_W);
187 template <Layout L> TensorInfo ker_info()
const
189 return make_info<L>(ker_N, ker_C, ker_H, ker_W);
191 TensorInfo bias_info(
void)
const {
return make_info(ker_N); }
202inline nonius::benchmark_registry &local_benchmark_registry()
204 static nonius::benchmark_registry registry;
210#define NONIUS_LOCAL_BENCHMARK(name, ...) \
213 static ::nonius::benchmark_registrar \
214 NONIUS_DETAIL_UNIQUE_NAME(benchmark_registrar)(local_benchmark_registry(), name, __VA_ARGS__); \
218 CLDeconvolutionLayer deconv;
234 p.deconv_info,
p.inner_border_right,
p.inner_border_top));
238 meter.measure([&](
int) {
247 p.inner_border_right,
p.inner_border_top);
254 meter.measure([&](
int) {
256 CLScheduler::get().sync();
261 CLDeconvolutionLayer deconv;
277 p.deconv_info,
p.inner_border_right,
p.inner_border_top));
281 meter.measure([&](
int) {
290 p.inner_border_right,
p.inner_border_top);
299 CLScheduler::get().sync();
304 CLDeconvolutionLayerEx deconv;
320 p.deconv_info,
p.inner_border_right,
p.inner_border_top));
324 meter.measure([&](
int) {
333 p.inner_border_right,
p.inner_border_top);
340 meter.measure([&](
int) {
342 CLScheduler::get().sync();
347 CLDeconvolutionLayerEx deconv;
363 p.deconv_info,
p.inner_border_right,
p.inner_border_top));
367 meter.measure([&](
int) {
376 p.inner_border_right,
p.inner_border_top);
383 meter.measure([&](
int) {
385 CLScheduler::get().sync();
391 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)