MCPcopy Create free account
hub / github.com/MegEngine/MegEngine / kern_naive_multi_src

Method kern_naive_multi_src

dnn/src/naive/warp_perspective/opr_impl.cpp:18–114  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

16
17template <typename ctype, typename mtype>
18void 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) {

Callers

nothing calls this directly

Calls 3

get_ptrMethod · 0.80
frontMethod · 0.80
MIDOUT_BEGINFunction · 0.70

Tested by

no test coverage detected