| 129 | |
| 130 | template <typename ctype, typename mtype> |
| 131 | void WarpPerspectiveForwardImpl::kern_naive( |
| 132 | const KernParam<ctype, mtype>& kern_param, size_t task_id) { |
| 133 | MEGDNN_MARK_USED_VAR(kern_param); |
| 134 | MIDOUT_BEGIN(megdnn_naive_warpperspective, ctype, mtype, midout_iv(0)) { |
| 135 | UNPACK_WARP_PERSPECTIVE_FWD_KERN_PARAM(kern_param); |
| 136 | MEGDNN_MARK_USED_VAR(N_MAT); |
| 137 | //! strides of C, H, W on src and dst |
| 138 | size_t sstrd[3], dstrd[3]; |
| 139 | auto set_sstrd = [&](size_t s0, size_t s1, size_t s2) { |
| 140 | sstrd[0] = s0; |
| 141 | sstrd[1] = s1; |
| 142 | sstrd[2] = s2; |
| 143 | }; |
| 144 | auto set_dstrd = [&](size_t s0, size_t s1, size_t s2) { |
| 145 | dstrd[0] = s0; |
| 146 | dstrd[1] = s1; |
| 147 | dstrd[2] = s2; |
| 148 | }; |
| 149 | switch (kern_param.format) { |
| 150 | case Format::NCHW: |
| 151 | case Format::NCHW4: |
| 152 | set_sstrd(IH * IW, IW, 1); |
| 153 | set_dstrd(OH * OW, OW, 1); |
| 154 | break; |
| 155 | case Format::NHWC: |
| 156 | set_sstrd(1, IW * C, C); |
| 157 | set_dstrd(1, OW * C, C); |
| 158 | break; |
| 159 | default: |
| 160 | megdnn_throw("bad format"); |
| 161 | } |
| 162 | |
| 163 | bool is_nchw4 = kern_param.format == Format::NCHW4; |
| 164 | auto visit_src = [&sptr, sstrd, is_nchw4](size_t c, int h, int w) -> float { |
| 165 | if (!is_nchw4) |
| 166 | return sptr[sstrd[0] * c + sstrd[1] * h + sstrd[2] * w]; |
| 167 | else |
| 168 | return sptr |
| 169 | [((sstrd[0] * (c >> 2) + sstrd[1] * h + sstrd[2] * w) << 2) + |
| 170 | (c & 0b11)]; |
| 171 | }; |
| 172 | auto visit_src_bd = [&sptr, sstrd, border_val, is_nchw4]( |
| 173 | size_t c, int h, int w) -> float { |
| 174 | if (h != -1 && w != -1) { |
| 175 | if (!is_nchw4) { |
| 176 | return sptr[sstrd[0] * c + sstrd[1] * h + sstrd[2] * w]; |
| 177 | } else { |
| 178 | return sptr |
| 179 | [((sstrd[0] * (c >> 2) + sstrd[1] * h + sstrd[2] * w) |
| 180 | << 2) + |
| 181 | (c & 0b11)]; |
| 182 | } |
| 183 | } else |
| 184 | return border_val; |
| 185 | }; |
| 186 | auto visit_dst = [&dptr, dstrd, is_nchw4](size_t c, int h, int w) -> ctype& { |
| 187 | if (!is_nchw4) |
| 188 | return dptr[dstrd[0] * c + dstrd[1] * h + dstrd[2] * w]; |
nothing calls this directly
no test coverage detected