| 15 | using namespace naive; |
| 16 | |
| 17 | void RegionRestrictedConvolutionForwardImpl::exec( |
| 18 | _megdnn_tensor_in src, _megdnn_tensor_in filter, _megdnn_tensor_in rin, |
| 19 | _megdnn_tensor_in rout, _megdnn_tensor_out dst, _megdnn_workspace workspace) { |
| 20 | #if !MGE_BUILD_WITHOUT_NAIVE_EXEC |
| 21 | MIDOUT_BEGIN(megdnn_naive_region_restricted_conv_fwd) { |
| 22 | auto filter_meta = check_exec( |
| 23 | src.layout, filter.layout, rin.layout, rout.layout, dst.layout, |
| 24 | workspace.size); |
| 25 | using ComputeMode = Param::ComputeMode; |
| 26 | #define DISPATCH_CMODE(in_dt, r_dt, out_dt, in_ct, r_ct, out_ct, comp_ct, cmode) \ |
| 27 | do { \ |
| 28 | using namespace dtype; \ |
| 29 | if (src.layout.dtype.enumv() == DTypeTrait<in_dt>::enumv && \ |
| 30 | dst.layout.dtype.enumv() == DTypeTrait<out_dt>::enumv && \ |
| 31 | rin.layout.dtype.enumv() == DTypeTrait<r_dt>::enumv && \ |
| 32 | rout.layout.dtype.enumv() == DTypeTrait<r_dt>::enumv && \ |
| 33 | param().compute_mode == cmode) { \ |
| 34 | MEGDNN_DISPATCH_CPU_KERN_OPR((convolution::region_restricted_forward< \ |
| 35 | in_ct, in_ct, r_ct, out_ct, comp_ct>( \ |
| 36 | src, filter, rin, rout, dst, filter_meta));); \ |
| 37 | return; \ |
| 38 | } \ |
| 39 | } while (0); |
| 40 | #define DISPATCH(in_dt, r_dt, out_dt, in_ct, r_ct, out_ct, comp_ct) \ |
| 41 | DISPATCH_CMODE( \ |
| 42 | in_dt, r_dt, out_dt, in_ct, r_ct, out_ct, comp_ct, ComputeMode::DEFAULT) |
| 43 | #define cb(dt) \ |
| 44 | DISPATCH( \ |
| 45 | dt, Int32, dt, DTypeTrait<dt>::ctype, dt_int32, DTypeTrait<dt>::ctype, \ |
| 46 | DTypeTrait<dt>::ctype) \ |
| 47 | DISPATCH( \ |
| 48 | dt, Uint8, dt, DTypeTrait<dt>::ctype, dt_uint8, DTypeTrait<dt>::ctype, \ |
| 49 | DTypeTrait<dt>::ctype) |
| 50 | MEGDNN_FOREACH_COMPUTING_DTYPE_FLOAT(cb); |
| 51 | #undef cb |
| 52 | DNN_INC_FLOAT16(DISPATCH_CMODE( |
| 53 | Float16, Int32, Float16, dt_float16, dt_int32, dt_float16, dt_float32, |
| 54 | ComputeMode::FLOAT32)); |
| 55 | DNN_INC_FLOAT16(DISPATCH_CMODE( |
| 56 | Float16, Uint8, Float16, dt_float16, dt_uint8, dt_float16, dt_float32, |
| 57 | ComputeMode::FLOAT32)); |
| 58 | #undef DISPATCH |
| 59 | megdnn_throw(ssprintf( |
| 60 | "unsupported RegionRestrictedConv(%s, %s, %s, %s) -> %s with cmode = " |
| 61 | "%d", |
| 62 | src.layout.dtype.name(), filter.layout.dtype.name(), |
| 63 | rin.layout.dtype.name(), rout.layout.dtype.name(), |
| 64 | dst.layout.dtype.name(), static_cast<int>(param().compute_mode))); |
| 65 | } |
| 66 | MIDOUT_END(); |
| 67 | #else |
| 68 | __builtin_trap(); |
| 69 | #endif |
| 70 | } |
| 71 | |
| 72 | size_t RegionRestrictedConvolutionBackwardDataImpl::get_workspace_in_bytes( |
| 73 | const TensorLayout& filter, const TensorLayout& diff, const TensorLayout& rin, |