diff options
author | David Monahan <david.monahan@arm.com> | 2020-08-31 15:50:32 +0100 |
---|---|---|
committer | David Monahan <david.monahan@arm.com> | 2020-08-31 16:36:08 +0100 |
commit | 82609564981ca40d0fc86d2bb4b8ee62648a41c6 (patch) | |
tree | 0a07578335a3f5a789ce6f6cafbeb991daeafd42 | |
parent | 5ccbdf1ac82013c8cb1c607252f72b6858e97a53 (diff) | |
download | android-nn-driver-82609564981ca40d0fc86d2bb4b8ee62648a41c6.tar.gz |
IVGCVSW-4917 Adding Unit test to Android-nn-driver for Hal1.3 Qos
Signed-off-by: David Monahan <david.monahan@arm.com>
Change-Id: Ie45464f2b04c8f2bb30ca06ff91b96492f2466b0
-rw-r--r-- | test/1.3/QosTests.cpp | 192 | ||||
-rw-r--r-- | test/Android.mk | 1 | ||||
-rw-r--r-- | test/DriverTestHelpers.cpp | 5 | ||||
-rw-r--r-- | test/DriverTestHelpers.hpp | 3 |
4 files changed, 198 insertions, 3 deletions
diff --git a/test/1.3/QosTests.cpp b/test/1.3/QosTests.cpp new file mode 100644 index 00000000..d51152b5 --- /dev/null +++ b/test/1.3/QosTests.cpp @@ -0,0 +1,192 @@ +// +// Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "../DriverTestHelpers.hpp" +#include "../TestTensor.hpp" + +#include "../1.3/HalPolicy.hpp" + +#include <armnn/utility/IgnoreUnused.hpp> + +#include <boost/test/unit_test.hpp> +#include <boost/test/data/test_case.hpp> + + +BOOST_AUTO_TEST_SUITE(QosTests) + +using ArmnnDriver = armnn_driver::ArmnnDriver; +using DriverOptions = armnn_driver::DriverOptions; + +using namespace android::nn; +using namespace android::hardware; +using namespace driverTestHelpers; +using namespace armnn_driver; + +using HalPolicy = hal_1_3::HalPolicy; + +namespace +{ + +void ExecuteModel(const armnn_driver::hal_1_3::HalPolicy::Model& model, + armnn_driver::ArmnnDriver& driver, + const V1_0::Request& request) +{ + android::sp<V1_3::IPreparedModel> preparedModel = PrepareModel_1_3(model, driver); + if (preparedModel.get() != nullptr) + { + Execute(preparedModel, request); + } +} + +#ifndef ARMCOMPUTECL_ENABLED +static const std::array<armnn::Compute, 1> COMPUTE_DEVICES = {{ armnn::Compute::CpuRef }}; +#else +static const std::array<armnn::Compute, 2> COMPUTE_DEVICES = {{ armnn::Compute::CpuRef, armnn::Compute::CpuAcc }}; +#endif + +BOOST_AUTO_TEST_CASE(ConcurrentExecuteWithQosPriority) +{ + ALOGI("ConcurrentExecuteWithQOSPriority: entry"); + + auto driver = std::make_unique<ArmnnDriver>(DriverOptions(armnn::Compute::CpuRef)); + HalPolicy::Model model = {}; + + // add operands + int32_t actValue = 0; + float weightValue[] = {2, 4, 1}; + float biasValue[] = {4}; + + AddInputOperand<HalPolicy>(model, hidl_vec<uint32_t>{1, 3}); + AddTensorOperand<HalPolicy>(model, + hidl_vec<uint32_t>{1, 3}, + weightValue, + HalPolicy::OperandType::TENSOR_FLOAT32, + V1_3::OperandLifeTime::CONSTANT_COPY); + AddTensorOperand<HalPolicy>(model, + hidl_vec<uint32_t>{1}, + biasValue, + HalPolicy::OperandType::TENSOR_FLOAT32, + V1_3::OperandLifeTime::CONSTANT_COPY); + AddIntOperand<HalPolicy>(model, actValue); + AddOutputOperand<HalPolicy>(model, hidl_vec<uint32_t>{1, 1}); + + // make the fully connected operation + model.main.operations.resize(1); + model.main.operations[0].type = HalPolicy::OperationType::FULLY_CONNECTED; + model.main.operations[0].inputs = hidl_vec<uint32_t>{0, 1, 2, 3}; + model.main.operations[0].outputs = hidl_vec<uint32_t>{4}; + + // make the prepared models + const size_t maxRequests = 45; + size_t preparedModelsSize = 0; + android::sp<V1_3::IPreparedModel> preparedModels[maxRequests]; + V1_3::ErrorStatus status(V1_3::ErrorStatus::NONE); + size_t start = preparedModelsSize; + for (size_t i = start; i < start+15; ++i) + { + preparedModels[i] = PrepareModelWithStatus_1_3(model, *driver, status, V1_3::Priority::LOW); + preparedModelsSize++; + } + start = preparedModelsSize; + for (size_t i = start; i < start+15; ++i) + { + preparedModels[i] = PrepareModelWithStatus_1_3(model, *driver, status, V1_3::Priority::MEDIUM); + preparedModelsSize++; + } + start = preparedModelsSize; + for (size_t i = start; i < start+15; ++i) + { + preparedModels[i] = PrepareModelWithStatus_1_3(model, *driver, status, V1_3::Priority::HIGH); + preparedModelsSize++; + } + + BOOST_TEST(maxRequests == preparedModelsSize); + + // construct the request data + DataLocation inloc = {}; + inloc.poolIndex = 0; + inloc.offset = 0; + inloc.length = 3 * sizeof(float); + RequestArgument input = {}; + input.location = inloc; + input.dimensions = hidl_vec<uint32_t>{}; + + DataLocation outloc = {}; + outloc.poolIndex = 1; + outloc.offset = 0; + outloc.length = 1 * sizeof(float); + RequestArgument output = {}; + output.location = outloc; + output.dimensions = hidl_vec<uint32_t>{}; + + // build the requests + V1_0::Request requests[maxRequests]; + android::sp<IMemory> outMemory[maxRequests]; + float* outdata[maxRequests]; + for (size_t i = 0; i < maxRequests; ++i) + { + requests[i].inputs = hidl_vec<RequestArgument>{input}; + requests[i].outputs = hidl_vec<RequestArgument>{output}; + // set the input data (matching source test) + float inDataLow[] = {2, 32, 16}; + float inDataMedium[] = {1, 31, 11}; + float inDataHigh[] = {3, 33, 17}; + if (i < 15) + { + AddPoolAndSetData<float>(3, requests[i], inDataLow); + } + else if (i < 30) + { + AddPoolAndSetData<float>(3, requests[i], inDataMedium); + } + else + { + AddPoolAndSetData<float>(3, requests[i], inDataHigh); + } + // add memory for the output + outMemory[i] = AddPoolAndGetData<float>(1, requests[i]); + outdata[i] = static_cast<float*>(static_cast<void*>(outMemory[i]->getPointer())); + } + + // invoke the execution of the requests + ALOGI("ConcurrentExecuteWithQOSPriority: executing requests"); + android::sp<ExecutionCallback> cb[maxRequests]; + for (size_t i = 0; i < maxRequests; ++i) + { + cb[i] = ExecuteNoWait(preparedModels[i], requests[i]); + } + + // wait for the requests to complete + ALOGI("ConcurrentExecuteWithQOSPriority: waiting for callbacks"); + for (size_t i = 0; i < maxRequests; ++i) + { + ARMNN_ASSERT(cb[i]); + cb[i]->wait(); + } + + // check the results + ALOGI("ConcurrentExecuteWithQOSPriority: validating results"); + for (size_t i = 0; i < maxRequests; ++i) + { + if (i < 15) + { + BOOST_TEST(outdata[i][0] == 152); + } + else if (i < 30) + { + BOOST_TEST(outdata[i][0] == 141); + } + else + { + BOOST_TEST(outdata[i][0] == 159); + } + + } + ALOGI("ConcurrentExecuteWithQOSPriority: exit"); +} + +} // anonymous namespace + +BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file diff --git a/test/Android.mk b/test/Android.mk index 9349a368..ca940f5b 100644 --- a/test/Android.mk +++ b/test/Android.mk @@ -379,6 +379,7 @@ LOCAL_SRC_FILES := \ 1.1/Lstm.cpp \ 1.2/Lstm.cpp \ 1.3/QLstm.cpp \ + 1.3/QosTests.cpp \ Tests.cpp \ UtilsTests.cpp \ Concurrent.cpp \ diff --git a/test/DriverTestHelpers.cpp b/test/DriverTestHelpers.cpp index c6d44065..8e8d7bef 100644 --- a/test/DriverTestHelpers.cpp +++ b/test/DriverTestHelpers.cpp @@ -198,7 +198,8 @@ android::sp<V1_2::IPreparedModel> PrepareModelWithStatus_1_2(const armnn_driver: android::sp<V1_3::IPreparedModel> PrepareModelWithStatus_1_3(const armnn_driver::hal_1_3::HalPolicy::Model& model, armnn_driver::ArmnnDriver& driver, - V1_3::ErrorStatus& prepareStatus) + V1_3::ErrorStatus& prepareStatus, + V1_3::Priority priority) { android::sp<PreparedModelCallback_1_3> cb(new PreparedModelCallback_1_3()); @@ -208,7 +209,7 @@ android::sp<V1_3::IPreparedModel> PrepareModelWithStatus_1_3(const armnn_driver: driver.prepareModel_1_3(model, V1_1::ExecutionPreference::LOW_POWER, - V1_3::Priority::LOW, + priority, {}, emptyHandle1, emptyHandle2, diff --git a/test/DriverTestHelpers.hpp b/test/DriverTestHelpers.hpp index f8f38545..05b78925 100644 --- a/test/DriverTestHelpers.hpp +++ b/test/DriverTestHelpers.hpp @@ -385,7 +385,8 @@ void AddOutputOperand(armnn_driver::hal_1_3::HalPolicy::Model& model, android::sp<V1_3::IPreparedModel> PrepareModelWithStatus_1_3(const armnn_driver::hal_1_3::HalPolicy::Model& model, armnn_driver::ArmnnDriver& driver, - V1_3::ErrorStatus& prepareStatus); + V1_3::ErrorStatus& prepareStatus, + V1_3::Priority priority = V1_3::Priority::LOW); template<typename HalModel> android::sp<V1_3::IPreparedModel> PrepareModel_1_3(const HalModel& model, |