| 110 | } // namespace megdnn |
| 111 | |
| 112 | void armv7::RelayoutForwardImpl::exec( |
| 113 | _megdnn_tensor_in src0, _megdnn_tensor_out dst0, Handle* src_handle) { |
| 114 | check_cpu_handle(src_handle); |
| 115 | TensorND src = src0, dst = dst0; |
| 116 | check_layout_and_canonize(src.layout, dst.layout); |
| 117 | |
| 118 | // FIXME: optimize for lowbit cases |
| 119 | if (src.layout.dtype.enumv() == DTypeEnum::QuantizedS4 || |
| 120 | src.layout.dtype.enumv() == DTypeEnum::Quantized4Asymm) { |
| 121 | fallback::RelayoutForwardImpl::exec(src0, dst0, src_handle); |
| 122 | return; |
| 123 | } |
| 124 | |
| 125 | relayout::TransposeParam trans_param; |
| 126 | bool trans = relayout::is_transpose(src.layout, dst.layout, trans_param); |
| 127 | if (trans && trans_param.c == 1 && src0.layout.dtype.size() == 1) { |
| 128 | MEGDNN_DISPATCH_CPU_KERN_OPR(transpose_fallback::transpose<TransposeByte>( |
| 129 | trans_param.batch, trans_param.m, trans_param.n, |
| 130 | static_cast<TransposeByte*>(src.raw_ptr()), |
| 131 | static_cast<TransposeByte*>(dst.raw_ptr()))); |
| 132 | return; |
| 133 | } |
| 134 | exec_after_preprocess(src, dst, trans ? &trans_param : nullptr); |
| 135 | } |
| 136 | |
| 137 | // vim: syntax=cpp.doxygen |
nothing calls this directly
no test coverage detected