| 144 | } |
| 145 | |
| 146 | void PaddingForwardImpl::exec(_megdnn_tensor_in src, _megdnn_tensor_out dst) { |
| 147 | #if !MGE_BUILD_WITHOUT_NAIVE_EXEC |
| 148 | forward_check_exec(src.layout, dst.layout); |
| 149 | SmallVector<size_t> offsets(get_offsets()); |
| 150 | ShapeParams params; |
| 151 | for (size_t i = 0; i < src.layout.ndim; ++i) { |
| 152 | params.src_shape[i] = src.layout.shape[i]; |
| 153 | params.dst_shape[i] = dst.layout.shape[i]; |
| 154 | params.src_stride[i] = src.layout.stride[i]; |
| 155 | params.dst_stride[i] = dst.layout.stride[i]; |
| 156 | params.offsets[i * 2] = offsets[i * 2]; |
| 157 | params.offsets[i * 2 + 1] = offsets[i * 2 + 1]; |
| 158 | } |
| 159 | |
| 160 | size_t n = dst.layout.total_nr_elems(); |
| 161 | switch (param().padding_mode) { |
| 162 | case param::Padding::PaddingMode::CONSTANT: |
| 163 | #define cb(DType) \ |
| 164 | if (src.layout.dtype.enumv() == DTypeTrait<DType>::enumv) { \ |
| 165 | using T = typename DTypeTrait<DType>::ctype; \ |
| 166 | MEGDNN_DISPATCH_CPU_KERN_OPR(exec_const_internal<T>( \ |
| 167 | src.layout.ndim, n, src.ptr<T>(), dst.ptr<T>(), params, \ |
| 168 | T(param().padding_val))); \ |
| 169 | return; \ |
| 170 | } |
| 171 | MEGDNN_FOREACH_COMPUTING_DTYPE(cb) |
| 172 | MEGDNN_FOREACH_QUANTIZED_DTYPE(cb) |
| 173 | #undef cb |
| 174 | break; |
| 175 | case param::Padding::PaddingMode::REPLICATE: |
| 176 | #define cb(DType) \ |
| 177 | if (src.layout.dtype.enumv() == DTypeTrait<DType>::enumv) { \ |
| 178 | using T = typename DTypeTrait<DType>::ctype; \ |
| 179 | MEGDNN_DISPATCH_CPU_KERN_OPR(exec_replicate_internal<T>( \ |
| 180 | src.layout.ndim, n, src.ptr<T>(), dst.ptr<T>(), params)); \ |
| 181 | return; \ |
| 182 | } |
| 183 | MEGDNN_FOREACH_COMPUTING_DTYPE(cb) |
| 184 | MEGDNN_FOREACH_QUANTIZED_DTYPE(cb) |
| 185 | #undef cb |
| 186 | break; |
| 187 | case param::Padding::PaddingMode::REFLECT: |
| 188 | #define cb(DType) \ |
| 189 | if (src.layout.dtype.enumv() == DTypeTrait<DType>::enumv) { \ |
| 190 | using T = typename DTypeTrait<DType>::ctype; \ |
| 191 | MEGDNN_DISPATCH_CPU_KERN_OPR(exec_reflect_internal<T>( \ |
| 192 | src.layout.ndim, n, src.ptr<T>(), dst.ptr<T>(), params)); \ |
| 193 | return; \ |
| 194 | } |
| 195 | MEGDNN_FOREACH_COMPUTING_DTYPE(cb) |
| 196 | MEGDNN_FOREACH_QUANTIZED_DTYPE(cb) |
| 197 | #undef cb |
| 198 | break; |
| 199 | default: |
| 200 | megdnn_assert(false, "unsupported padding mode!"); |
| 201 | } |
| 202 | #else |
| 203 | __builtin_trap(); |
nothing calls this directly
no test coverage detected