// // Copyright © 2017 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include "DriverTestHelpers.hpp" #include "TestTensor.hpp" #include #include using namespace android::hardware; using namespace driverTestHelpers; using namespace armnn_driver; using HalPolicy = hal_1_0::HalPolicy; using RequestArgument = V1_0::RequestArgument; namespace { void ConcatTestImpl(const std::vector & inputs, int32_t concatAxis, const TestTensor & expectedOutputTensor, armnn::Compute computeDevice, V1_0::ErrorStatus expectedPrepareStatus=V1_0::ErrorStatus::NONE, V1_0::ErrorStatus expectedExecStatus=V1_0::ErrorStatus::NONE) { std::unique_ptr driver = std::make_unique(DriverOptions(computeDevice)); HalPolicy::Model model{}; hidl_vec modelInputIds; modelInputIds.resize(inputs.size()+1); for (uint32_t i = 0; i(model, inputs[i]->GetDimensions()); } modelInputIds[inputs.size()] = inputs.size(); // add an id for the axis too AddIntOperand(model, concatAxis); AddOutputOperand(model, expectedOutputTensor.GetDimensions()); // make the concat operation model.operations.resize(1); model.operations[0].type = HalPolicy::OperationType::CONCATENATION; model.operations[0].inputs = modelInputIds; model.operations[0].outputs = hidl_vec{static_cast(inputs.size()+1)}; // make the prepared model V1_0::ErrorStatus prepareStatus = V1_0::ErrorStatus::NONE; android::sp preparedModel = PrepareModelWithStatus(model, *driver, prepareStatus, expectedPrepareStatus); DOCTEST_CHECK((int)prepareStatus == (int)expectedPrepareStatus); if (prepareStatus != V1_0::ErrorStatus::NONE) { // prepare failed, we cannot continue return; } DOCTEST_CHECK(preparedModel.get() != nullptr); if (preparedModel.get() == nullptr) { // don't spoil other tests if prepare failed return; } // construct the request hidl_vec inputArguments; hidl_vec outputArguments; inputArguments.resize(inputs.size()); outputArguments.resize(1); // the request's memory pools will follow the same order as // the inputs for (uint32_t i = 0; iGetNumElements() * sizeof(float); RequestArgument input = {}; input.location = inloc; input.dimensions = inputs[i]->GetDimensions(); inputArguments[i] = input; } // and an additional memory pool is needed for the output { V1_0::DataLocation outloc = {}; outloc.poolIndex = inputs.size(); outloc.offset = 0; outloc.length = expectedOutputTensor.GetNumElements() * sizeof(float); RequestArgument output = {}; output.location = outloc; output.dimensions = expectedOutputTensor.GetDimensions(); outputArguments[0] = output; } // make the request based on the arguments V1_0::Request request = {}; request.inputs = inputArguments; request.outputs = outputArguments; // set the input data for (uint32_t i = 0; iGetNumElements(), request, inputs[i]->GetData()); } // add memory for the output android::sp outMemory = AddPoolAndGetData(expectedOutputTensor.GetNumElements(), request); float* outdata = static_cast(static_cast(outMemory->getPointer())); // run the execution DOCTEST_CHECK(preparedModel.get() != nullptr); auto execStatus = Execute(preparedModel, request, expectedExecStatus); DOCTEST_CHECK((int)execStatus == (int)expectedExecStatus); if (execStatus == V1_0::ErrorStatus::NONE) { // check the result if there was no error const float * expectedOutput = expectedOutputTensor.GetData(); for (unsigned int i=0; i DOCTEST_TEST_SUITE("ConcatTests_CpuRef") { DOCTEST_TEST_CASE("SimpleConcatAxis0") { SimpleConcatAxis0(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("ConcatAxis0NoInterleave") { ConcatAxis0NoInterleave(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("SimpleConcatAxis1") { SimpleConcatAxis1(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("ConcatAxis1NoInterleave") { ConcatAxis1NoInterleave(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("SimpleConcatAxis1DoInterleave") { SimpleConcatAxis1DoInterleave(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("SimpleConcatAxis2") { SimpleConcatAxis2(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("ConcatAxis2NoInterleave") { ConcatAxis2NoInterleave(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("SimpleConcatAxis2DoInterleave") { SimpleConcatAxis2DoInterleave(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("SimpleConcatAxis3") { SimpleConcatAxis3(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("SimpleConcatAxis3DoInterleave") { SimpleConcatAxis3DoInterleave(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("AxisTooBig") { AxisTooBig(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("AxisTooSmall") { AxisTooSmall(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("TooFewInputs") { TooFewInputs(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("MismatchedInputDimensions") { MismatchedInputDimensions(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("MismatchedInputRanks") { MismatchedInputRanks(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("MismatchedOutputDimensions") { MismatchedOutputDimensions(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("MismatchedOutputRank") { MismatchedOutputRank(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("ValidNegativeAxis") { ValidNegativeAxis(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("SimpleConcatAxisZero3D") { SimpleConcatAxisZero3D(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("SimpleConcatAxisOne3D") { SimpleConcatAxisOne3D(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("SimpleConcatAxisTwo3D") { SimpleConcatAxisTwo3D(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("SimpleConcatAxisZero2D") { SimpleConcatAxisZero2D(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("SimpleConcatAxisOne2D") { SimpleConcatAxisOne2D(armnn::Compute::CpuRef); } DOCTEST_TEST_CASE("SimpleConcatAxisZero1D") { SimpleConcatAxisZero1D(armnn::Compute::CpuRef); } } #ifdef ARMCOMPUTECL_ENABLED DOCTEST_TEST_SUITE("ConcatTests_GpuAcc") { DOCTEST_TEST_CASE("SimpleConcatAxis0") { SimpleConcatAxis0(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("ConcatAxis0NoInterleave") { ConcatAxis0NoInterleave(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("SimpleConcatAxis1") { SimpleConcatAxis1(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("ConcatAxis1NoInterleave") { ConcatAxis1NoInterleave(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("SimpleConcatAxis1DoInterleave") { SimpleConcatAxis1DoInterleave(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("SimpleConcatAxis2") { SimpleConcatAxis2(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("ConcatAxis2NoInterleave") { ConcatAxis2NoInterleave(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("SimpleConcatAxis2DoInterleave") { SimpleConcatAxis2DoInterleave(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("SimpleConcatAxis3") { SimpleConcatAxis3(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("SimpleConcatAxis3DoInterleave") { SimpleConcatAxis3DoInterleave(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("AxisTooBig") { AxisTooBig(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("AxisTooSmall") { AxisTooSmall(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("TooFewInputs") { TooFewInputs(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("MismatchedInputDimensions") { MismatchedInputDimensions(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("MismatchedInputRanks") { MismatchedInputRanks(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("MismatchedOutputDimensions") { MismatchedOutputDimensions(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("MismatchedOutputRank") { MismatchedOutputRank(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("ValidNegativeAxis") { ValidNegativeAxis(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("SimpleConcatAxisZero3D") { SimpleConcatAxisZero3D(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("SimpleConcatAxisOne3D") { SimpleConcatAxisOne3D(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("SimpleConcatAxisTwo3D") { SimpleConcatAxisTwo3D(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("SimpleConcatAxisZero2D") { SimpleConcatAxisZero2D(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("SimpleConcatAxisOne2D") { SimpleConcatAxisOne2D(armnn::Compute::GpuAcc); } DOCTEST_TEST_CASE("SimpleConcatAxisZero1D") { SimpleConcatAxisZero1D(armnn::Compute::GpuAcc); } }// End of GpuAcc Test Suite #endif