|
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