Skip to content

Commit 9ebfff5

Browse files
committed
optimize recomputes
1 parent 19606ab commit 9ebfff5

1 file changed

Lines changed: 48 additions & 22 deletions

File tree

src/layers/TransposeLayer.cpp

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -44,33 +44,59 @@ void TransposeLayer::transpose_impl(const Tensor& input, Tensor& output,
4444
}
4545
Shape new_shape(new_dims);
4646

47-
std::vector<T> output_values(input_data->size());
48-
49-
std::vector<size_t> new_indices(shape.dims());
50-
std::vector<size_t> old_indices(shape.dims());
47+
std::vector<size_t> input_strides(shape.dims());
48+
size_t stride = 1;
49+
for (size_t dim = shape.dims(); dim-- > 0;) {
50+
input_strides[dim] = stride;
51+
stride *= shape[dim];
52+
}
5153

52-
for (size_t i = 0; i < input_data->size(); ++i) {
53-
size_t remaining = i;
54-
for (size_t dim = shape.dims(); dim-- > 0;) {
55-
old_indices[dim] = remaining % shape[dim];
56-
remaining /= shape[dim];
57-
}
54+
std::vector<size_t> output_strides(new_shape.dims());
55+
stride = 1;
56+
for (size_t dim = new_shape.dims(); dim-- > 0;) {
57+
output_strides[dim] = stride;
58+
stride *= new_shape[dim];
59+
}
5860

59-
for (size_t dim = 0; dim < perm.size(); ++dim) {
60-
new_indices[dim] = old_indices[static_cast<size_t>(perm[dim])];
61-
}
61+
std::vector<T> output_values(input_data->size());
6262

63-
size_t new_index = 0;
64-
size_t stride = 1;
65-
for (size_t dim = new_shape.dims(); dim-- > 0;) {
66-
new_index += new_indices[dim] * stride;
67-
stride *= new_shape[dim];
63+
if (shape.dims() == 2) {
64+
const size_t rows = shape[0];
65+
const size_t cols = shape[1];
66+
67+
if (perm[0] == 1 && perm[1] == 0) {
68+
for (size_t i = 0; i < rows; ++i) {
69+
for (size_t j = 0; j < cols; ++j) {
70+
output_values[j * rows + i] = (*input_data)[i * cols + j];
71+
}
72+
}
73+
} else {
74+
for (size_t i = 0; i < input_data->size(); ++i) {
75+
size_t old_index = i;
76+
size_t new_index = 0;
77+
78+
for (size_t dim = 0; dim < perm.size(); ++dim) {
79+
const size_t axis = static_cast<size_t>(perm[dim]);
80+
const size_t coord = (old_index / input_strides[axis]) % shape[axis];
81+
new_index += coord * output_strides[dim];
82+
}
83+
84+
output_values[new_index] = (*input_data)[i];
85+
}
6886
}
69-
70-
if (new_index >= output_values.size()) {
71-
throw std::runtime_error("Index out of bounds during transposition");
87+
} else {
88+
for (size_t i = 0; i < input_data->size(); ++i) {
89+
size_t old_index = i;
90+
size_t new_index = 0;
91+
92+
for (size_t dim = 0; dim < perm.size(); ++dim) {
93+
const size_t axis = static_cast<size_t>(perm[dim]);
94+
const size_t coord = (old_index / input_strides[axis]) % shape[axis];
95+
new_index += coord * output_strides[dim];
96+
}
97+
98+
output_values[new_index] = (*input_data)[i];
7299
}
73-
output_values[new_index] = (*input_data)[i];
74100
}
75101

76102
output = make_tensor(output_values, new_shape);

0 commit comments

Comments
 (0)