| 90 | } |
| 91 | |
| 92 | void extract_from_workspace( |
| 93 | _megdnn_tensor_out dst, _megdnn_tensor_in src, size_t group) { |
| 94 | megdnn_assert( |
| 95 | dst.layout.is_contiguous() && src.layout.is_contiguous(), "dst %s, src %s", |
| 96 | dst.layout.to_string().c_str(), src.layout.to_string().c_str()); |
| 97 | const size_t n = dst.layout[0]; |
| 98 | const size_t n_stride_dst_in_bytes = dst.layout.dtype.size(dst.layout.stride[0]); |
| 99 | const size_t n_stride_src_in_bytes = src.layout.dtype.size(src.layout.stride[0]); |
| 100 | const size_t ocpg = dst.layout[1] / group; |
| 101 | const size_t icpg = src.layout[1] / group; |
| 102 | const size_t dst_c_stride_in_bytes = dst.layout.dtype.size(dst.layout.stride[1]); |
| 103 | const size_t src_c_stride_in_bytes = src.layout.dtype.size(src.layout.stride[1]); |
| 104 | megdnn_assert(dst_c_stride_in_bytes == src_c_stride_in_bytes); |
| 105 | for (size_t nid = 0; nid < n; ++nid) { |
| 106 | const size_t n_offset_dst = nid * n_stride_dst_in_bytes; |
| 107 | const size_t n_offset_src = nid * n_stride_src_in_bytes; |
| 108 | for (size_t gid = 0; gid < group; ++gid) { |
| 109 | memcpy(reinterpret_cast<char*>(dst.raw_ptr()) + n_offset_dst + |
| 110 | gid * ocpg * dst_c_stride_in_bytes, |
| 111 | reinterpret_cast<char*>(src.raw_ptr()) + n_offset_src + |
| 112 | gid * icpg * src_c_stride_in_bytes, |
| 113 | ocpg * dst_c_stride_in_bytes); |
| 114 | } |
| 115 | } |
| 116 | }; |
| 117 | |
| 118 | template <typename dtype> |
| 119 | void padding_src_to_workspace( |
no test coverage detected