ONE - On-device Neural Engine
Loading...
Searching...
No Matches
Concat.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2025 Samsung Electronics Co., Ltd. All Rights Reserved
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "../KernelGenerator.h"
18#include "../Validator.h"
19
20#include <AclKernelGen.h>
21
23{
24
25void Validator::visit(const ir::operation::Concat &) { _supported = true; }
26
27void KernelGenerator::visit(const ir::operation::Concat &node)
28{
29 const auto ofm_index{node.getOutputs().at(0)};
30
31 std::vector<ir::OperandIndex> input_indexes;
32 for (const auto &input : node.getInputs())
33 input_indexes.emplace_back(input);
34
35 const auto axis = node.param().axis;
36
37 // Concat elimination check
38 bool eliminated = _tensor_builder->areSubTensorsOf(ofm_index, node.getInputs());
39 if (eliminated)
40 {
41 // If concat eliminated, return a NOP IFunction
42 VERBOSE(acl_neon_KernelGenerator_Concat) << "Concat eliminated" << std::endl;
43 _return_fn = std::make_unique<exec::NopFunction>();
44 return;
45 }
46
47 auto output_tensor = _tensor_reg->getAclTensor(ofm_index);
48 std::vector<const ::arm_compute::ITensor *> input_tensors;
49 for (const auto &ifm_ind : input_indexes)
50 input_tensors.emplace_back(_tensor_reg->getAclTensor(ifm_ind)->handle());
51
52 std::unique_ptr<::arm_compute::IFunction> fn;
53 if (input_indexes.size() < 2)
54 {
55 ::arm_compute::ITensor *input_tesor = _tensor_reg->getAclTensor(input_indexes.at(0))->handle();
56 fn = acl_common::generateLayer<arm_compute::NECopy>(input_tesor, output_tensor->handle());
57 }
58 else
59 {
60 const auto rank = _ctx.at(ofm_index).shape().rank();
61 const auto fixed_axis = acl_common::ToARMComputeAxis(rank, axis).value();
62 fn = acl_common::generateLayer<arm_compute::NEConcatenateLayer>(
63 input_tensors, output_tensor->handle(), fixed_axis);
64 }
65
67}
68
69} // namespace onert::backend::acl_neon
std::unique_ptr< exec::IFunction > _return_fn
const Object & at(const Index &index) const
Get the object that is associated with the given index.
#define VERBOSE(name, lv)
Definition Log.h:71
ARMComputeAxis ToARMComputeAxis(uint32_t rank, uint32_t axis)
Definition Swizzle.h:45
std::unique_ptr< AclFunction > asAclFunction(std::unique_ptr<::arm_compute::IFunction > &&layer)
Definition Convert.cc:246