diff options
author | Chunseok Lee <chunseok.lee@samsung.com> | 2019-01-08 17:36:34 +0900 |
---|---|---|
committer | Chunseok Lee <chunseok.lee@samsung.com> | 2019-01-08 17:36:34 +0900 |
commit | bd11b24234d7d43dfe05a81c520aa01ffad06e42 (patch) | |
tree | 57d0d4044977e4fa0e50cd9ba40b32006dff19eb /runtimes/pure_arm_compute/src/internal/layers/SimpleUnpackLayer.cc | |
parent | 91f4ba45449f700a047a4aeea00b1a7c84e94c75 (diff) | |
download | nnfw-bd11b24234d7d43dfe05a81c520aa01ffad06e42.tar.gz nnfw-bd11b24234d7d43dfe05a81c520aa01ffad06e42.tar.bz2 nnfw-bd11b24234d7d43dfe05a81c520aa01ffad06e42.zip |
Imported Upstream version 0.3upstream/0.3
Diffstat (limited to 'runtimes/pure_arm_compute/src/internal/layers/SimpleUnpackLayer.cc')
-rw-r--r-- | runtimes/pure_arm_compute/src/internal/layers/SimpleUnpackLayer.cc | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/runtimes/pure_arm_compute/src/internal/layers/SimpleUnpackLayer.cc b/runtimes/pure_arm_compute/src/internal/layers/SimpleUnpackLayer.cc new file mode 100644 index 000000000..910595a44 --- /dev/null +++ b/runtimes/pure_arm_compute/src/internal/layers/SimpleUnpackLayer.cc @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "internal/arm_compute.h" +#include "SimpleUnpackLayer.h" + +void SimpleUnpackLayer::configure(::arm_compute::ICLTensor *input, + const std::vector<::arm_compute::ICLTensor *> &output_vector, + int32_t axis) +{ + uint32_t nr_outputs = output_vector.size(); + _cl_permuted_vector.resize(nr_outputs); + _cl_permute_vector.resize(nr_outputs); + uint32_t input_rank = input->info()->num_dimensions(); + const ::arm_compute::PermutationVector pv{2, 0, 1}; + _input = input; + // Negatige axis is supported, -1 implies R-1 axis where R is input rank + if (axis < 0) + { + axis += input_rank; + } + _axis = ToARMComputeAxis(input_rank, axis).value(); + _cl_reshape_vector.resize(nr_outputs); + + ::arm_compute::TensorShape subTensor_shape{}; + for (int i = 0; i < input_rank; i++) + { + if (i != _axis) + { + subTensor_shape.set(i, _input->info()->tensor_shape()[i]); + } + else + { + subTensor_shape.set(i, 1); + } + } + + auto subTensor_offset = ::arm_compute::Coordinates{}; + subTensor_offset.set_num_dimensions(input_rank); + + for (int i = 0; i < output_vector.size(); i++) + { + _output_vector.push_back(output_vector[i]); + subTensor_offset[_axis] = i; + auto temp_tensor = std::make_shared<::arm_compute::CLSubTensor>( + CAST_CL(_input), subTensor_shape, subTensor_offset, true); + _sub_tensor_vector.push_back(temp_tensor); + // Copies into the subtensor + _cl_permute_vector[i].configure(_sub_tensor_vector[i].get(), &_cl_permuted_vector[i], pv); + _cl_reshape_vector[i].configure(&_cl_permuted_vector[i], CAST_CL(_output_vector[i])); + _cl_permuted_vector[i].allocator()->allocate(); + } +} + +void SimpleUnpackLayer::run(void) +{ + for (int i = 0; i < _output_vector.size(); i++) + { + _cl_permute_vector[i].run(); + _cl_reshape_vector[i].run(); + } +} |