| 16 | |
| 17 | template <typename ctype, typename mtype> |
| 18 | void WarpPerspectiveForwardImpl::kern_naive_multi_src( |
| 19 | const KernParam<ctype, mtype>& kern_param, size_t task_id) { |
| 20 | MEGDNN_MARK_USED_VAR(kern_param); |
| 21 | MIDOUT_BEGIN(megdnn_naive_warpperspective, ctype, mtype, midout_iv(0)) { |
| 22 | UNPACK_WARP_PERSPECTIVE_FWD_KERN_PARAM(kern_param); |
| 23 | MEGDNN_MARK_USED_VAR(N_MAT); |
| 24 | //! strides of C, H, W on src and dst |
| 25 | size_t sstrd[3], dstrd[3]; |
| 26 | auto set_sstrd = [&](size_t s0, size_t s1, size_t s2) { |
| 27 | sstrd[0] = s0; |
| 28 | sstrd[1] = s1; |
| 29 | sstrd[2] = s2; |
| 30 | }; |
| 31 | auto set_dstrd = [&](size_t s0, size_t s1, size_t s2) { |
| 32 | dstrd[0] = s0; |
| 33 | dstrd[1] = s1; |
| 34 | dstrd[2] = s2; |
| 35 | }; |
| 36 | switch (kern_param.format) { |
| 37 | case Format::NCHW: |
| 38 | set_sstrd(IH * IW, IW, 1); |
| 39 | set_dstrd(OH * OW, OW, 1); |
| 40 | break; |
| 41 | case Format::NHWC: |
| 42 | set_sstrd(1, IW * C, C); |
| 43 | set_dstrd(1, OW * C, C); |
| 44 | break; |
| 45 | default: |
| 46 | megdnn_throw("bad format"); |
| 47 | } |
| 48 | |
| 49 | auto visit_src = [&sptr, sstrd](size_t c, int h, int w) -> float { |
| 50 | return sptr[sstrd[0] * c + sstrd[1] * h + sstrd[2] * w]; |
| 51 | }; |
| 52 | auto visit_src_bd = [&sptr, sstrd, border_val]( |
| 53 | size_t c, int h, int w) -> float { |
| 54 | if (h != -1 && w != -1) { |
| 55 | return sptr[sstrd[0] * c + sstrd[1] * h + sstrd[2] * w]; |
| 56 | } else |
| 57 | return border_val; |
| 58 | }; |
| 59 | auto visit_dst = [&dptr, dstrd](size_t c, int h, int w) -> ctype& { |
| 60 | return dptr[dstrd[0] * c + dstrd[1] * h + dstrd[2] * w]; |
| 61 | }; |
| 62 | |
| 63 | rounding::RoundingConverter<ctype> output_converter; |
| 64 | sptr = static_cast<const ctype*>(kern_param.srcs_ptr.front().get_ptr()); |
| 65 | size_t n = task_id / OH; |
| 66 | size_t oh = task_id % OH; |
| 67 | mptr = mptr + n * 3 * 3; |
| 68 | dptr = dptr + n * C * OH * OW; |
| 69 | if (midx_ptr) { |
| 70 | size_t idx = midx_ptr[n]; |
| 71 | megdnn_assert( |
| 72 | idx < N_SRC, "mat_idx out of bound: mat_idx[%zu]=%zu src_batch=%zu", |
| 73 | n, idx, N_SRC); |
| 74 | sptr = sptrs[idx]; |
| 75 | } else if (n) { |
nothing calls this directly
no test coverage detected