44 constexpr
unsigned int heigh_idx = 2;
46 const int src_conv_width =
static_cast<int32_t
>(shape_conv_src[
width_idx]);
47 const int src_conv_height =
static_cast<int32_t
>(shape_conv_src[heigh_idx]);
48 const int dst_conv_width =
static_cast<int32_t
>(shape_conv_dst[
width_idx]);
49 const int wei_conv_width =
static_cast<int32_t
>(shape_conv_wei[
width_idx]);
50 const int wei_conv_height =
static_cast<int32_t
>(shape_conv_wei[heigh_idx]);
51 const int dst_width =
static_cast<int32_t
>(shape_dst[0]);
52 const int dst_height =
static_cast<int32_t
>(shape_dst[1]);
53 const int dst_batch =
static_cast<int32_t
>(shape_dst[2]);
54 const int ks = wei_conv_width * wei_conv_height;
55 const int stride_x =
static_cast<int32_t
>(
conv_info.stride().first);
56 const int stride_y =
static_cast<int32_t
>(
conv_info.stride().second);
57 const int pad_left =
static_cast<int32_t
>(
conv_info.pad_left());
58 const int pad_top =
static_cast<int32_t
>(
conv_info.pad_top());
60 const int m0 = dst_width / ks;
62 for(
int z = 0; z < dst_batch; ++z)
64 for(
int y = 0; y < dst_height; ++y)
66 const int mout = y * m0;
67 for(
int ki = 0; ki < ks; ++ki)
69 const int xk = ki % wei_conv_width;
70 const int yk = ki / wei_conv_width;
71 for(
int mi = 0; mi < m0; ++mi)
73 int xi = ((mout + mi) % dst_conv_width) * stride_x;
74 int yi = ((mout + mi) / dst_conv_width) * stride_y;
77 const int x_s = xi + xk;
78 const int y_s = yi + yk;
79 int my = x_s + y_s * src_conv_width;
80 my = my + z * src_conv_width * src_conv_height;
81 my = x_s >= 0 ? my : -1;
82 my = x_s < src_conv_width ? my : -1;
83 my = y_s >= 0 ? my : -1;
84 my = y_s < src_conv_height ? my : -1;
86 const unsigned int addr_out = mi + ki * m0 + y * (dst_width) + z * (dst_width * dst_height);