38 const uintptr_t src_shape[4],
39 const uintptr_t src_strides[4],
40 const uintptr_t dst_strides[4],
41 uintptr_t element_size,
47 const auto src_block_row_stride = (src_shape[0] / block_size) * element_size;
48 const auto dst_width_block_stride = block_size * dst_strides[1];
50 auto *src_batch_ptr =
src;
51 auto *dst_batch_ptr =
dst;
53 for (uintptr_t batch = 0; batch < src_shape[3]; ++batch)
55 auto *src_height_block_ptr = src_batch_ptr;
56 auto *dst_row_ptr = dst_batch_ptr;
58 for (uintptr_t height_block = 0; height_block < src_shape[2]; ++height_block)
60 auto *src_block_row_ptr = src_height_block_ptr;
62 for (uintptr_t block_row = 0; block_row < block_size; ++block_row)
64 auto *src_width_block_ptr = src_block_row_ptr;
65 auto *dst_width_block_ptr = dst_row_ptr;
67 for (uintptr_t width_block = 0; width_block < src_shape[1]; ++width_block)
86 std::memcpy(dst_width_block_ptr, src_width_block_ptr, src_block_row_stride);
88 src_width_block_ptr += src_strides[1];
89 dst_width_block_ptr += dst_width_block_stride;
92 src_block_row_ptr += src_block_row_stride;
93 dst_row_ptr += dst_strides[2];
96 src_height_block_ptr += src_strides[2];
99 src_batch_ptr += src_strides[3];
100 dst_batch_ptr += dst_strides[3];