31 PermuteLayer(
const std::vector<ITensor *> &src_tensors,
const std::vector<ITensor *> &dst_tensors,
32 const std::vector<ir::PermuteType> &types,
33 const std::shared_ptr<ExternalContext> &external_context);
40 std::shared_ptr<ExternalContext> _external_context;
49 struct PermuteWorkerTask : ruy::Task
57 _src_start_offset{
src_tensor.calcOffset(start_coords)},
58 _dst_start_offset{
dst_tensor.calcOffset(start_coords)}, _src_strides{}, _dst_strides{},
59 _loop_shape{loop_shape}, _size{
size}, _permute_type{permute_type}
66 PermuteWorkerTask(
const uint8_t *src_buffer, uint8_t *dst_buffer, uint32_t src_start_offset,
67 uint32_t dst_start_offset,
size_t size)
68 : _src_buffer{src_buffer}, _dst_buffer{dst_buffer}, _src_start_offset{src_start_offset},
69 _dst_start_offset{dst_start_offset}, _src_strides{0}, _dst_strides{0}, _loop_shape{1},
74 void setBuffers(
const uint8_t *src_buffer, uint8_t *dst_buffer)
76 _src_buffer = src_buffer;
77 _dst_buffer = dst_buffer;
82 size_t src_offset = _src_start_offset;
83 size_t dst_offset = _dst_start_offset;
84 assert(
static_cast<size_t>(_loop_shape.rank()) ==
coords.size());
90 for (
auto i = 0; i < _loop_shape.rank(); ++i)
92 assert(
coords[i] >= 0 && dst_coords[i] >= 0);
93 src_offset +=
coords[i] * _src_strides[i];
94 dst_offset += dst_coords[i] * _dst_strides[i];
96 memcpy(_dst_buffer + dst_offset, _src_buffer + src_offset, _size);
101 void setStrides(
const ITensor &tensor, Strides *strides)
103 auto shape = tensor.getShape();
104 const size_t rank = shape.rank();
105 for (
size_t i = 0; i < rank; ++i)
109 if (shape.dim(i) > 1)
111 strides->set(i, tensor.calcOffset(one_step) - tensor.calcOffset(no_step));
119 assert((*strides)[i] >= 0);
124 const uint8_t *_src_buffer;
125 uint8_t *_dst_buffer;
126 size_t _src_start_offset;
127 size_t _dst_start_offset;
128 Strides _src_strides;
129 Strides _dst_strides;
134 std::unordered_map<const ITensor *, std::vector<PermuteWorkerTask>> _tasks_map;
Array< CornerBox > coords