|
11 | 11 | int padding_bot = cfg->padding_bottom; |
12 | 12 | int padding_left = cfg->padding_left; |
13 | 13 | int padding_right = cfg->padding_right; |
14 | | - int kernel_height = weights->shape[KRNL_H_DIM_HWC]; |
15 | | - int kernel_width = weights->shape[KRNL_W_DIM_HWC]; |
16 | | - int out_ch = weights->shape[KRNL_C_DIM_HWC]; |
17 | | - int in_ch = in->shape[FMAP_C_DIM_HWC]; |
| 14 | + |
| 15 | + // Define Data dimensions |
| 16 | + const auto in_prv = mli_prv_get_tensor_hwc<MLI_PTR($d_type), MLI_PTR_IS_XY>(in, |
| 17 | + $channels); // channels |
| 18 | + const auto w = mli_prv_get_conv2d_weights_tensor_nhwc<MLI_PTR($w_type), MLI_PTR_IS_XY>(weights, |
| 19 | + $channels, // channels |
| 20 | + $kernel_w, // kernel_width |
| 21 | + $kernel_h); // kernel_height |
| 22 | + __builtin_assume(in_prv.ch == w.in_ch); |
18 | 23 |
|
19 | 24 | // assign hard coded values for this variation to some variables |
20 | 25 | #if $stride_w |
|
29 | 34 | MLI_CHECK_AND_FIX(padding_left, $padding_left); |
30 | 35 | MLI_CHECK_AND_FIX(padding_right, $padding_right); |
31 | 36 | #endif |
32 | | -#if $kernel_w |
33 | | - MLI_CHECK_AND_FIX(kernel_width, $kernel_w); |
34 | | -#endif |
35 | | -#if $kernel_h |
36 | | - MLI_CHECK_AND_FIX(kernel_height, $kernel_h); |
37 | | -#endif |
38 | | -#if $channels |
39 | | - MLI_CHECK_AND_FIX(in_ch, $channels); |
40 | | -#endif |
41 | 37 |
|
42 | 38 | mli_minmax_t val_limit; |
43 | 39 | // fill output tensor el_type parameter |
|
46 | 42 | val_limit = mli_prv_get_relu_min_max(&cfg->relu, out); |
47 | 43 |
|
48 | 44 | // Data pointers |
49 | | - MLI_PTR($d_type) in_ftrs = (MLI_PTR($d_type ))in->data; |
50 | | - MLI_CONV_OUT_PTR($d_type) out_ftrs = (MLI_CONV_OUT_PTR($d_type ))out->data; |
51 | | - MLI_PTR($w_type) wt = (MLI_PTR($w_type ))weights->data; |
52 | 45 | MLI_PTR($b_type) bs = (MLI_PTR($b_type ))bias->data; |
53 | 46 |
|
54 | 47 | // Define Data dimensions |
55 | | - int in_height = in->shape[FMAP_H_DIM_HWC]; |
56 | | - int in_width = in->shape[FMAP_W_DIM_HWC]; |
| 48 | + int out_width = CEIL_DIV(in_prv.width + padding_left + padding_right - w.kernel_width + 1, stride_width); |
| 49 | + int out_height = CEIL_DIV(in_prv.height + padding_top + padding_bot - w.kernel_height + 1, stride_height); |
57 | 50 |
|
58 | | - int out_width = CEIL_DIV(in_width + padding_left + padding_right - kernel_width + 1, stride_width); |
59 | | - int out_height = CEIL_DIV(in_height + padding_top + padding_bot - kernel_height + 1, stride_height); |
| 51 | + // fill output tensor parameters |
| 52 | + out->rank = in->rank; |
| 53 | + out->shape[FMAP_C_DIM_HWC] = w.out_ch; |
| 54 | + out->shape[FMAP_H_DIM_HWC] = out_height; |
| 55 | + out->shape[FMAP_W_DIM_HWC] = out_width; |
| 56 | + const auto out_prv = mli_prv_get_tensor_hwc<MLI_CONV_OUT_PTR($d_type), MLI_CONV_OUT_PTR_IS_XY>(out); |
60 | 57 |
|
61 | 58 | // Define quantization specific params |
62 | 59 | s8asym_quant_specific_params params; |
|
70 | 67 | cent_area.clmn_end = out_width; |
71 | 68 |
|
72 | 69 | $core_name<$d_type, $w_type, $b_type, int32_t>( |
73 | | - in_ftrs, wt, bs, out_ftrs, ¢_area, params, |
74 | | - (int8_t)val_limit.min, (int8_t)val_limit.max, in_ch, in_width, in_height, |
75 | | - out_ch, out_width, out_height, kernel_height, kernel_width, |
76 | | - stride_height, stride_width, padding_top, padding_left, padding_bot, padding_right); |
77 | | - |
78 | | - // fill output tensor parameters |
79 | | - out->rank = in->rank; |
80 | | - out->shape[FMAP_C_DIM_HWC] = out_ch; |
81 | | - out->shape[FMAP_H_DIM_HWC] = out_height; |
82 | | - out->shape[FMAP_W_DIM_HWC] = out_width; |
| 70 | + in_prv, w, bs, out_prv, |
| 71 | + ¢_area, params, |
| 72 | + (int8_t)val_limit.min, (int8_t)val_limit.max, |
| 73 | + stride_height, stride_width, |
| 74 | + padding_top, padding_left, padding_bot, padding_right); |
83 | 75 |
|
84 | 76 | return MLI_STATUS_OK; |
85 | 77 | } |
0 commit comments