});
}
+void StageGenerator::visit(const model::operation::UnpackNode &node)
+{
+ const auto input_index{node.getInputs().at(model::operation::UnpackNode::Input::INPUT)};
+ const auto axis{node.param().axis};
+
+ const auto input_rank = _ctx.at(input_index).shape().rank();
+
+ struct Param
+ {
+ model::OperandIndex input_index;
+ std::vector<model::OperandIndex> output_indexes;
+ int32_t axis;
+ };
+
+ Param param;
+ param.input_index = input_index;
+ param.axis = axis;
+ if (param.axis < 0)
+ param.axis += input_rank;
+ param.axis = acl_common::ToARMComputeAxis(input_rank, param.axis).value();
+
+ _tensor_builder->dimCorrection(input_index, false);
+ for (const auto &output_index : node.getOutputs())
+ {
+ param.output_indexes.emplace_back(output_index);
+ _tensor_builder->dimCorrection(output_index, false);
+ }
+
+ auto tensors = _tensor_builder;
+
+ returnStage([tensors, param](IExecutionBuilder &builder) {
+ auto input = tensors->at(param.input_index).get()->handle();
+ std::vector<arm_compute::ICLTensor *> outputs;
+ for (const auto output_index : param.output_indexes)
+ {
+ outputs.emplace_back(tensors->at(output_index)->handle());
+ }
+
+ int axis = param.axis;
+ if (input->info()->num_dimensions() == 4 &&
+ input->info()->data_layout() == ::arm_compute::DataLayout::NCHW)
+ {
+ // CWHN -> WHCN
+ const int permutation[4] = {2, 0, 1, 3};
+ axis = permutation[axis];
+ }
+
+ auto fn = nnfw::cpp14::make_unique<::arm_compute::CLUnstack>();
+
+ fn->configure(input, outputs, axis);
+
+ builder.append(asAclFunction(std::move(fn)));
+ });
+}
+
} // namespace acl_cl
} // namespace backend
} // namespace neurun
void visit(const model::operation::DepthToSpaceNode &) override;
void visit(const model::operation::ReduceMinNode &) override;
void visit(const model::operation::SplitNode &) override;
+ void visit(const model::operation::UnpackNode &) override;
private:
const neurun::model::Operands &_ctx;
}
}
+void OperationValidator::visit(const model::operation::UnpackNode &node)
+{
+ const auto input_index{node.getInputs().at(model::operation::UnpackNode::Input::INPUT)};
+ const auto num{node.param().num};
+ const auto axis{node.param().axis};
+
+ const auto &input_shape = _ctx.at(input_index).shape();
+ const auto input_rank = static_cast<int32_t>(input_shape.rank());
+
+ UNUSED_RELEASE(num);
+ UNUSED_RELEASE(axis);
+ UNUSED_RELEASE(input_rank);
+
+ assert(num == static_cast<int32_t>(node.getOutputs().size()));
+ assert(axis >= -input_rank && axis < input_rank);
+}
+
} // namespace compiler
} // namespace neurun
void visit(const model::operation::DepthToSpaceNode &node) override;
void visit(const model::operation::ReduceMinNode &node) override;
void visit(const model::operation::LSTMNode &node) override;
+ void visit(const model::operation::UnpackNode &node) override;
private:
const neurun::model::Operands &_ctx;
VERBOSE(LIR) << " - Output : Output(" << node.getOutputs().at(0).value() << ")" << std::endl;
}
+void Dumper::visit(const model::operation::UnpackNode &node)
+{
+ VERBOSE(LIR) << "* Unpack" << std::endl;
+ VERBOSE(LIR) << " - Inputs : Input(" << node.getInputs().at(UnpackNode::Input::INPUT).value()
+ << ")" << std::endl;
+ std::string outputs;
+ const auto &output_indices = node.getOutputs();
+ for (auto it = std::begin(output_indices); it != std::end(output_indices); ++it)
+ {
+ outputs += std::to_string(it->value());
+ if (std::next(it) != std::end(output_indices))
+ outputs += ", ";
+ }
+ VERBOSE(LIR) << " - Outputs : Outputs(" << outputs << ")" << std::endl;
+}
+
} // namespace dumper
} // namespace graph
} // namespace neurun
void visit(const model::operation::TopKV2Node &) override;
void visit(const model::operation::TransposeConvNode &) override;
void visit(const model::operation::TransposeNode &) override;
+ void visit(const model::operation::UnpackNode &) override;
};
} // namespace dumper
GeneratedTests.prelu_ex_broadcast_quant8_1
# Unexpected result
GeneratedTests.pack*
-GeneratedTests.unpack*
# Not support broadcast
GeneratedTests.logical_or_ex_broadcast_4D_2D
# Unsupported optional input that has shape