Skip to content

Commit 5828486

Browse files
authored
Merge pull request #129 from foss-for-synopsys-dwc-arc-processors/mem_stride
[memory strides] add memory stride support to kernels
2 parents a89e019 + 28318a0 commit 5828486

35 files changed

+4321
-5237
lines changed

build/rules.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ else
119119
ifeq ($(TOOLCHAIN),mwdt)
120120
# place to add MWDT-specific common settings
121121
CFLAGS +=-Hon=Long_enums
122+
CFLAGS +=-mllvm -gen-lpcc=false
122123
DEPFLAGS =-Hdepend=$(BUILD_DIR)/ -MD
123124
else
124125
$(error ERROR - Unsupported toolchain. Supported toolchains are 'gnu' and 'mwdt', default one is 'gnu')

include/mli_config.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,18 @@
9898
*/
9999
#if (ARC_PLATFORM == V2DSP_XY)
100100
#define MLI_PTR(p) __xy p *
101+
#define MLI_PTR_IS_XY true
101102
#define MLI_OUT_PTR(p) __xy p *
103+
#define MLI_OUT_PTR_IS_XY true
102104
#define MLI_CONV_OUT_PTR(p) p *
105+
#define MLI_CONV_OUT_PTR_IS_XY false
103106
#else
104107
#define MLI_PTR(p) p *
108+
#define MLI_PTR_IS_XY false
105109
#define MLI_OUT_PTR(p) p *
110+
#define MLI_OUT_PTR_IS_XY false
106111
#define MLI_CONV_OUT_PTR(p) p *
112+
#define MLI_CONV_OUT_PTR_IS_XY false
107113
#endif
108114

109115
#endif // _MLI_CONFIG_H_

lib/gen/mli_krn_avepool_chw_func_body.txt

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@
99
int padding_bot = cfg->padding_bottom;
1010
int padding_left = cfg->padding_left;
1111
int padding_right = cfg->padding_right;
12-
int channels_num = in->shape[FMAP_C_DIM_CHW];
1312
int kernel_height = cfg->kernel_height;
1413
int kernel_width = cfg->kernel_width;
14+
15+
// Define Data dimensions
16+
auto in_prv = mli_prv_get_tensor_chw<MLI_PTR($d_type), MLI_PTR_IS_XY>(in,
17+
$channels); // channels
18+
1519
// assign hard coded values for this variation to some variables
1620
#if $stride_w
1721
MLI_CHECK_AND_FIX(stride_width, $stride_w);
@@ -31,20 +35,19 @@
3135
#if $kernel_h
3236
MLI_CHECK_AND_FIX(kernel_height, $kernel_h);
3337
#endif
34-
#if $channels
35-
MLI_CHECK_AND_FIX(channels_num, $channels);
36-
#endif
37-
38-
// Data pointers
39-
MLI_PTR($d_type) in_ftrs = (MLI_PTR($d_type ))in->data;
40-
MLI_OUT_PTR($d_type) out_ftrs = (MLI_OUT_PTR($d_type ))out->data;
4138

4239
// Define Data dimensions
43-
const int in_height = in->shape[FMAP_H_DIM_CHW];
44-
const int in_width = in->shape[FMAP_W_DIM_CHW];
40+
const int out_width = CEIL_DIV(in_prv.width + padding_left + padding_right - kernel_width + 1, stride_width);
41+
const int out_height = CEIL_DIV(in_prv.height + padding_top + padding_bot - kernel_height + 1, stride_height);
4542

46-
const int out_width = CEIL_DIV(in_width + padding_left + padding_right - kernel_width + 1, stride_width);
47-
const int out_height = CEIL_DIV(in_height + padding_top + padding_bot - kernel_height + 1, stride_height);
43+
// fill output tensor parameters
44+
out->el_type = in->el_type;
45+
out->rank = in->rank;
46+
out->shape[FMAP_C_DIM_CHW] = in_prv.ch;
47+
out->shape[FMAP_H_DIM_CHW] = out_height;
48+
out->shape[FMAP_W_DIM_CHW] = out_width;
49+
out->el_params.fx.frac_bits = in->el_params.fx.frac_bits;
50+
const auto out_prv = mli_prv_get_tensor_chw<MLI_OUT_PTR($d_type), MLI_OUT_PTR_IS_XY>(out);
4851

4952
const int row_beg = 0;
5053
const int row_end = out_height;
@@ -56,20 +59,10 @@
5659
$core_name(
5760
row_beg, row_end,
5861
clmn_beg, clmn_end,
59-
in_ftrs, out_ftrs,
60-
channels_num, in_width, in_height,
61-
out_width, out_height,
62+
in_prv, out_prv,
6263
kernel_height, kernel_width,
6364
stride_height, stride_width,
6465
padding_top, padding_left, padding_right, padding_bot);
6566

66-
// fill output tensor parameters
67-
out->el_type = in->el_type;
68-
out->rank = in->rank;
69-
out->shape[FMAP_C_DIM_CHW] = channels_num;
70-
out->shape[FMAP_H_DIM_CHW] = out_height;
71-
out->shape[FMAP_W_DIM_CHW] = out_width;
72-
out->el_params.fx.frac_bits = in->el_params.fx.frac_bits;
73-
7467
return MLI_STATUS_OK;
7568
}

lib/gen/mli_krn_avepool_hwc_func_body.txt

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@
99
int padding_bot = cfg->padding_bottom;
1010
int padding_left = cfg->padding_left;
1111
int padding_right = cfg->padding_right;
12-
int channels_num = in->shape[FMAP_C_DIM_HWC];
1312
int kernel_height = cfg->kernel_height;
1413
int kernel_width = cfg->kernel_width;
14+
15+
// Define Data dimensions
16+
auto in_prv = mli_prv_get_tensor_hwc<MLI_PTR($d_type), MLI_PTR_IS_XY>(in,
17+
$channels); // channels
18+
1519
// assign hard coded values for this variation to some variables
1620
#if $stride_w
1721
MLI_CHECK_AND_FIX(stride_width, $stride_w);
@@ -31,20 +35,19 @@
3135
#if $kernel_h
3236
MLI_CHECK_AND_FIX(kernel_height, $kernel_h);
3337
#endif
34-
#if $channels
35-
MLI_CHECK_AND_FIX(channels_num, $channels);
36-
#endif
37-
38-
// Data pointers
39-
MLI_PTR($d_type) in_ftrs = (MLI_PTR($d_type ))in->data;
40-
MLI_OUT_PTR($d_type) out_ftrs = (MLI_OUT_PTR($d_type ))out->data;
4138

4239
// Define Data dimensions
43-
const int in_height = in->shape[FMAP_H_DIM_HWC];
44-
const int in_width = in->shape[FMAP_W_DIM_HWC];
40+
const int out_width = CEIL_DIV(in_prv.width + padding_left + padding_right - kernel_width + 1, stride_width);
41+
const int out_height = CEIL_DIV(in_prv.height + padding_top + padding_bot - kernel_height + 1, stride_height);
4542

46-
const int out_width = CEIL_DIV(in_width + padding_left + padding_right - kernel_width + 1, stride_width);
47-
const int out_height = CEIL_DIV(in_height + padding_top + padding_bot - kernel_height + 1, stride_height);
43+
// fill output tensor parameters
44+
out->el_type = in->el_type;
45+
out->rank = in->rank;
46+
out->shape[FMAP_H_DIM_HWC] = out_height;
47+
out->shape[FMAP_W_DIM_HWC] = out_width;
48+
out->shape[FMAP_C_DIM_HWC] = in_prv.ch;
49+
out->el_params.$el_params = in->el_params.$el_params;
50+
const auto out_prv = mli_prv_get_tensor_hwc<MLI_OUT_PTR($d_type), MLI_OUT_PTR_IS_XY>(out);
4851

4952
const int row_beg = 0;
5053
const int row_end = out_height;
@@ -56,20 +59,10 @@
5659
$core_name(
5760
row_beg, row_end,
5861
clmn_beg, clmn_end,
59-
in_ftrs, out_ftrs,
60-
channels_num, in_width, in_height,
61-
out_width, out_height,
62+
in_prv, out_prv,
6263
kernel_height, kernel_width,
6364
stride_height, stride_width,
6465
padding_top, padding_left, padding_right, padding_bot);
6566

66-
// fill output tensor parameters
67-
out->el_type = in->el_type;
68-
out->rank = in->rank;
69-
out->shape[FMAP_H_DIM_HWC] = out_height;
70-
out->shape[FMAP_W_DIM_HWC] = out_width;
71-
out->shape[FMAP_C_DIM_HWC] = channels_num;
72-
out->el_params.$el_params = in->el_params.$el_params;
73-
7467
return MLI_STATUS_OK;
7568
}

lib/gen/mli_krn_conv2d_nhwc_func_body.txt

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,15 @@
1111
int padding_bot = cfg->padding_bottom;
1212
int padding_left = cfg->padding_left;
1313
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);
1823

1924
// assign hard coded values for this variation to some variables
2025
#if $stride_w
@@ -29,15 +34,6 @@
2934
MLI_CHECK_AND_FIX(padding_left, $padding_left);
3035
MLI_CHECK_AND_FIX(padding_right, $padding_right);
3136
#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
4137

4238
mli_minmax_t val_limit;
4339
// fill output tensor el_type parameter
@@ -46,17 +42,18 @@
4642
val_limit = mli_prv_get_relu_min_max(&cfg->relu, out);
4743

4844
// 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;
5245
MLI_PTR($b_type) bs = (MLI_PTR($b_type ))bias->data;
5346

5447
// 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);
5750

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);
6057

6158
// Define quantization specific params
6259
s8asym_quant_specific_params params;
@@ -70,16 +67,11 @@
7067
cent_area.clmn_end = out_width;
7168

7269
$core_name<$d_type, $w_type, $b_type, int32_t>(
73-
in_ftrs, wt, bs, out_ftrs, &cent_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+
&cent_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);
8375

8476
return MLI_STATUS_OK;
8577
}

lib/gen/mli_krn_depthwise_conv2d_hwcn_func_body.txt

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,14 @@
1111
int padding_bot = cfg->padding_bottom;
1212
int padding_left = cfg->padding_left;
1313
int padding_right = cfg->padding_right;
14-
int kernel_height = weights->shape[KRNL_DW_H_DIM_HWC];
15-
int kernel_width = weights->shape[KRNL_DW_W_DIM_HWC];
16-
int out_ch = weights->shape[KRNL_DW_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_1hwn<MLI_PTR($w_type), MLI_PTR_IS_XY>(
19+
weights,
20+
$kernel_w, // kernel_width
21+
$kernel_h); // kernel_height
1822

1923
// assign hard coded values for this variation to some variables
2024
#if $stride_w
@@ -29,15 +33,6 @@
2933
MLI_CHECK_AND_FIX(padding_left, $padding_left);
3034
MLI_CHECK_AND_FIX(padding_right, $padding_right);
3135
#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
4136

4237
mli_minmax_t val_limit;
4338
// fill output tensor el_type parameter
@@ -46,18 +41,18 @@
4641
val_limit = mli_prv_get_relu_min_max(&cfg->relu, out);
4742

4843
// 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;
5244
MLI_PTR($b_type) bs = (MLI_PTR($b_type ))bias->data;
5345

5446
// Define Data dimensions
55-
int in_height = in->shape[FMAP_H_DIM_HWC];
56-
int in_width = in->shape[FMAP_W_DIM_HWC];
47+
int out_width = CEIL_DIV(in_prv.width + padding_left + padding_right - w.kernel_width + 1, stride_width);
48+
int out_height = CEIL_DIV(in_prv.height + padding_top + padding_bot - w.kernel_height + 1, stride_height);
5749

58-
59-
int out_width = CEIL_DIV(in_width + padding_left + padding_right - kernel_width + 1, stride_width);
60-
int out_height = CEIL_DIV(in_height + padding_top + padding_bot - kernel_height + 1, stride_height);
50+
// fill output tensor parameters
51+
out->rank = in->rank;
52+
out->shape[FMAP_C_DIM_HWC] = w.out_ch;
53+
out->shape[FMAP_H_DIM_HWC] = out_height;
54+
out->shape[FMAP_W_DIM_HWC] = out_width;
55+
const auto out_prv = mli_prv_get_tensor_hwc<MLI_CONV_OUT_PTR($d_type), MLI_CONV_OUT_PTR_IS_XY>(out);
6156

6257
// Define quantization specific params
6358
s8asym_quant_specific_params params;
@@ -71,16 +66,9 @@
7166
cent_area.clmn_end = out_width;
7267

7368
$core_name<$d_type, $w_type, $b_type, int32_t>(
74-
in_ftrs, wt, bs, out_ftrs, &cent_area, params,
75-
(int8_t)val_limit.min, (int8_t)val_limit.max, in_ch, in_width, in_height,
76-
out_ch, out_width, out_height, kernel_height, kernel_width,
69+
in_prv, w, bs, out_prv, &cent_area, params,
70+
(int8_t)val_limit.min, (int8_t)val_limit.max,
7771
stride_height, stride_width, padding_top, padding_left, padding_bot, padding_right);
7872

79-
// fill output tensor parameters
80-
out->rank = in->rank;
81-
out->shape[FMAP_C_DIM_HWC] = out_ch;
82-
out->shape[FMAP_H_DIM_HWC] = out_height;
83-
out->shape[FMAP_W_DIM_HWC] = out_width;
84-
8573
return MLI_STATUS_OK;
8674
}

lib/gen/mli_krn_maxpool_chw_func_body.txt

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@
99
int32_t padding_bot = cfg->padding_bottom;
1010
int32_t padding_left = cfg->padding_left;
1111
int32_t padding_right = cfg->padding_right;
12-
int32_t channels_num = in->shape[FMAP_C_DIM_CHW];
1312
int32_t kernel_height = cfg->kernel_height;
1413
int32_t kernel_width = cfg->kernel_width;
14+
15+
// Define Data dimensions
16+
auto in_prv = mli_prv_get_tensor_chw<MLI_PTR($d_type), MLI_PTR_IS_XY>(in,
17+
$channels); // channels
18+
1519
// assign hard coded values for this variation to some variables
1620
#if $stride_w
1721
MLI_CHECK_AND_FIX(stride_width, $stride_w);
@@ -31,20 +35,19 @@
3135
#if $kernel_h
3236
MLI_CHECK_AND_FIX(kernel_height, $kernel_h);
3337
#endif
34-
#if $channels
35-
MLI_CHECK_AND_FIX(channels_num, $channels);
36-
#endif
37-
38-
// Data pointers
39-
MLI_PTR($d_type) in_ftrs = (MLI_PTR($d_type ))in->data;
40-
MLI_OUT_PTR($d_type) out_ftrs = (MLI_OUT_PTR($d_type ))out->data;
4138

4239
// Define Data dimensions
43-
const int32_t in_height = in->shape[FMAP_H_DIM_CHW];
44-
const int32_t in_width = in->shape[FMAP_W_DIM_CHW];
40+
const int32_t out_width = CEIL_DIV(in_prv.width + padding_left + padding_right - kernel_width + 1, stride_width);
41+
const int32_t out_height = CEIL_DIV(in_prv.height + padding_top + padding_bot - kernel_height + 1, stride_height);
4542

46-
const int32_t out_width = CEIL_DIV(in_width + padding_left + padding_right - kernel_width + 1, stride_width);
47-
const int32_t out_height = CEIL_DIV(in_height + padding_top + padding_bot - kernel_height + 1, stride_height);
43+
// fill output tensor parameters
44+
out->el_type = in->el_type;
45+
out->rank = in->rank;
46+
out->shape[FMAP_C_DIM_CHW] = in_prv.ch;
47+
out->shape[FMAP_H_DIM_CHW] = out_height;
48+
out->shape[FMAP_W_DIM_CHW] = out_width;
49+
out->el_params.fx.frac_bits = in->el_params.fx.frac_bits;
50+
const auto out_prv = mli_prv_get_tensor_chw<MLI_OUT_PTR($d_type), MLI_OUT_PTR_IS_XY>(out);
4851

4952
const int32_t row_beg = 0;
5053
const int32_t row_end = out_height;
@@ -54,23 +57,13 @@
5457
mli_prv_fx_init_dsp_ctrl();
5558

5659
$core_name(
57-
in_ftrs, out_ftrs,
60+
in_prv, out_prv,
5861
row_beg, row_end,
5962
clmn_beg, clmn_end,
60-
channels_num, in_width, in_height,
61-
out_width, out_height,
6263
kernel_height, kernel_width,
6364
stride_height, stride_width,
6465
padding_top, padding_bot, padding_left, padding_right,
6566
$kernelpadding);
6667

67-
// fill output tensor parameters
68-
out->el_type = in->el_type;
69-
out->rank = in->rank;
70-
out->shape[FMAP_C_DIM_CHW] = channels_num;
71-
out->shape[FMAP_H_DIM_CHW] = out_height;
72-
out->shape[FMAP_W_DIM_CHW] = out_width;
73-
out->el_params.fx.frac_bits = in->el_params.fx.frac_bits;
74-
7568
return MLI_STATUS_OK;
7669
}

0 commit comments

Comments
 (0)