From 6a903a78a637f240a5a5a13fffa36fd0cfbdcf7d Mon Sep 17 00:00:00 2001 From: Sadik Armagan Date: Tue, 26 May 2020 10:41:54 +0100 Subject: IVGCVSW-4850 Create QLSTM unit test in android-nn-driver * Added QLSTM unit tests Signed-off-by: Sadik Armagan Change-Id: Ibb7587d8a4fae4a630e7e80f4c3ce830665a7c77 --- test/DriverTestHelpers.hpp | 361 ++++++++++++++++++++++++++++++++------------- 1 file changed, 258 insertions(+), 103 deletions(-) (limited to 'test/DriverTestHelpers.hpp') diff --git a/test/DriverTestHelpers.hpp b/test/DriverTestHelpers.hpp index 66d6ac5c..f8f38545 100644 --- a/test/DriverTestHelpers.hpp +++ b/test/DriverTestHelpers.hpp @@ -28,6 +28,16 @@ namespace V1_0 std::ostream& operator<<(std::ostream& os, V1_0::ErrorStatus stat); } // namespace android::hardware::neuralnetworks::V1_0 + +#ifdef ARMNN_ANDROID_NN_V1_3 +namespace V1_3 +{ + +std::ostream& operator<<(std::ostream& os, V1_3::ErrorStatus stat); + +} // namespace android::hardware::neuralnetworks::V1_3 +#endif + } // namespace android::hardware::neuralnetworks } // namespace android::hardware } // namespace android @@ -37,6 +47,10 @@ namespace driverTestHelpers std::ostream& operator<<(std::ostream& os, V1_0::ErrorStatus stat); +#ifdef ARMNN_ANDROID_NN_V1_3 +std::ostream& operator<<(std::ostream& os, V1_3::ErrorStatus stat); +#endif + struct ExecutionCallback : public V1_0::IExecutionCallback { ExecutionCallback() : mNotified(false) {} @@ -71,7 +85,7 @@ private: android::sp m_PreparedModel; }; -#ifdef ARMNN_ANDROID_NN_V1_2 +#if defined(ARMNN_ANDROID_NN_V1_2) || defined(ARMNN_ANDROID_NN_V1_3) class PreparedModelCallback_1_2 : public V1_2::IPreparedModelCallback { @@ -101,6 +115,46 @@ private: #endif +#ifdef ARMNN_ANDROID_NN_V1_3 + +class PreparedModelCallback_1_3 : public V1_3::IPreparedModelCallback +{ +public: + PreparedModelCallback_1_3() + : m_1_0_ErrorStatus(V1_0::ErrorStatus::NONE) + , m_1_3_ErrorStatus(V1_3::ErrorStatus::NONE) + , m_PreparedModel() + , m_PreparedModel_1_2() + , m_PreparedModel_1_3() + { } + ~PreparedModelCallback_1_3() override { } + + Return notify(V1_0::ErrorStatus status, const android::sp& preparedModel) override; + + Return notify_1_2(V1_0::ErrorStatus status, const android::sp& preparedModel) override; + + Return notify_1_3(V1_3::ErrorStatus status, const android::sp& preparedModel) override; + + V1_0::ErrorStatus GetErrorStatus() { return m_1_0_ErrorStatus; } + + V1_3::ErrorStatus Get_1_3_ErrorStatus() { return m_1_3_ErrorStatus; } + + android::sp GetPreparedModel() { return m_PreparedModel; } + + android::sp GetPreparedModel_1_2() { return m_PreparedModel_1_2; } + + android::sp GetPreparedModel_1_3() { return m_PreparedModel_1_3; } + +private: + V1_0::ErrorStatus m_1_0_ErrorStatus; + V1_3::ErrorStatus m_1_3_ErrorStatus; + android::sp m_PreparedModel; + android::sp m_PreparedModel_1_2; + android::sp m_PreparedModel_1_3; +}; + +#endif + hidl_memory allocateSharedMemory(int64_t size); template @@ -141,30 +195,6 @@ void AddOperand(HalModel& model, const HalOperand& op) model.operands[model.operands.size() - 1] = op; } -template -void AddIntOperand(HalModel& model, int32_t value, uint32_t numberOfConsumers = 1) -{ - using HalOperand = typename HalPolicy::Operand; - using HalOperandType = typename HalPolicy::OperandType; - using HalOperandLifeTime = typename HalPolicy::OperandLifeTime; - - DataLocation location = {}; - location.offset = model.operandValues.size(); - location.length = sizeof(int32_t); - - HalOperand op = {}; - op.type = HalOperandType::INT32; - op.dimensions = hidl_vec{}; - op.lifetime = HalOperandLifeTime::CONSTANT_COPY; - op.location = location; - op.numberOfConsumers = numberOfConsumers; - - model.operandValues.resize(model.operandValues.size() + location.length); - *reinterpret_cast(&model.operandValues[location.offset]) = value; - - AddOperand(model, op); -} - template void AddBoolOperand(HalModel& model, bool value, uint32_t numberOfConsumers = 1) { @@ -199,80 +229,8 @@ template<> OperandType TypeToOperandType(); template -void AddTensorOperand(HalModel& model, - const hidl_vec& dimensions, - const T* values, - HalOperandType operandType = HalOperandType::TENSOR_FLOAT32, - HalOperandLifeTime operandLifeTime = V1_0::OperandLifeTime::CONSTANT_COPY, - double scale = 0.f, - int offset = 0, - uint32_t numberOfConsumers = 1) -{ - using HalOperand = typename HalPolicy::Operand; - - uint32_t totalElements = 1; - for (uint32_t dim : dimensions) - { - totalElements *= dim; - } - - DataLocation location = {}; - location.length = totalElements * sizeof(T); - - if(operandLifeTime == HalOperandLifeTime::CONSTANT_COPY) - { - location.offset = model.operandValues.size(); - } - - HalOperand op = {}; - op.type = operandType; - op.dimensions = dimensions; - op.scale = scale; - op.zeroPoint = offset; - op.lifetime = HalOperandLifeTime::CONSTANT_COPY; - op.location = location; - op.numberOfConsumers = numberOfConsumers; - - model.operandValues.resize(model.operandValues.size() + location.length); - for (uint32_t i = 0; i < totalElements; i++) - { - *(reinterpret_cast(&model.operandValues[location.offset]) + i) = values[i]; - } - - AddOperand(model, op); -} - -template -void AddTensorOperand(HalModel& model, - const hidl_vec& dimensions, - const std::vector& values, - HalOperandType operandType = HalPolicy::OperandType::TENSOR_FLOAT32, - HalOperandLifeTime operandLifeTime = V1_0::OperandLifeTime::CONSTANT_COPY, - double scale = 0.f, - int offset = 0, - uint32_t numberOfConsumers = 1) -{ - AddTensorOperand(model, - dimensions, - values.data(), - operandType, - operandLifeTime, - scale, - offset, - numberOfConsumers); -} - -template + typename HalModel = typename HalPolicy::Model, + typename HalOperandType = typename HalPolicy::OperandType> void AddInputOperand(HalModel& model, const hidl_vec& dimensions, HalOperandType operandType = HalOperandType::TENSOR_FLOAT32, @@ -298,8 +256,8 @@ void AddInputOperand(HalModel& model, } template + typename HalModel = typename HalPolicy::Model, + typename HalOperandType = typename HalPolicy::OperandType> void AddOutputOperand(HalModel& model, const hidl_vec& dimensions, HalOperandType operandType = HalOperandType::TENSOR_FLOAT32, @@ -329,7 +287,7 @@ android::sp PrepareModelWithStatus(const V1_0::Model& mode V1_0::ErrorStatus& prepareStatus, V1_0::ErrorStatus expectedStatus = V1_0::ErrorStatus::NONE); -#if defined(ARMNN_ANDROID_NN_V1_1) || defined(ARMNN_ANDROID_NN_V1_2) +#if defined(ARMNN_ANDROID_NN_V1_1) || defined(ARMNN_ANDROID_NN_V1_2) || defined(ARMNN_ANDROID_NN_V1_3) android::sp PrepareModelWithStatus(const V1_1::Model& model, armnn_driver::ArmnnDriver& driver, @@ -346,7 +304,7 @@ android::sp PrepareModel(const HalModel& model, return PrepareModelWithStatus(model, driver, prepareStatus); } -#ifdef ARMNN_ANDROID_NN_V1_2 +#if defined(ARMNN_ANDROID_NN_V1_2) || defined(ARMNN_ANDROID_NN_V1_3) android::sp PrepareModelWithStatus_1_2(const armnn_driver::hal_1_2::HalPolicy::Model& model, armnn_driver::ArmnnDriver& driver, @@ -363,6 +321,203 @@ android::sp PrepareModel_1_2(const HalModel& model, #endif +#ifdef ARMNN_ANDROID_NN_V1_3 + +template +void AddOperand(armnn_driver::hal_1_3::HalPolicy::Model& model, + const armnn_driver::hal_1_3::HalPolicy::Operand& op) +{ + model.main.operands.resize(model.main.operands.size() + 1); + model.main.operands[model.main.operands.size() - 1] = op; +} + +template +void AddInputOperand(armnn_driver::hal_1_3::HalPolicy::Model& model, + const hidl_vec& dimensions, + armnn_driver::hal_1_3::HalPolicy::OperandType operandType = + armnn_driver::hal_1_3::HalPolicy::OperandType::TENSOR_FLOAT32, + double scale = 0.f, + int offset = 0, + uint32_t numberOfConsumers = 1) +{ + using HalOperand = typename armnn_driver::hal_1_3::HalPolicy::Operand; + using HalOperandLifeTime = typename armnn_driver::hal_1_3::HalPolicy::OperandLifeTime; + + HalOperand op = {}; + op.type = operandType; + op.scale = scale; + op.zeroPoint = offset; + op.dimensions = dimensions; + op.lifetime = HalOperandLifeTime::SUBGRAPH_INPUT; + op.numberOfConsumers = numberOfConsumers; + + AddOperand(model, op); + + model.main.inputIndexes.resize(model.main.inputIndexes.size() + 1); + model.main.inputIndexes[model.main.inputIndexes.size() - 1] = model.main.operands.size() - 1; +} + +template +void AddOutputOperand(armnn_driver::hal_1_3::HalPolicy::Model& model, + const hidl_vec& dimensions, + armnn_driver::hal_1_3::HalPolicy::OperandType operandType = + armnn_driver::hal_1_3::HalPolicy::OperandType::TENSOR_FLOAT32, + double scale = 0.f, + int offset = 0, + uint32_t numberOfConsumers = 0) +{ + using HalOperand = typename armnn_driver::hal_1_3::HalPolicy::Operand; + using HalOperandLifeTime = typename armnn_driver::hal_1_3::HalPolicy::OperandLifeTime; + + HalOperand op = {}; + op.type = operandType; + op.scale = scale; + op.zeroPoint = offset; + op.dimensions = dimensions; + op.lifetime = HalOperandLifeTime::SUBGRAPH_OUTPUT; + op.numberOfConsumers = numberOfConsumers; + + AddOperand(model, op); + + model.main.outputIndexes.resize(model.main.outputIndexes.size() + 1); + model.main.outputIndexes[model.main.outputIndexes.size() - 1] = model.main.operands.size() - 1; +} + +android::sp PrepareModelWithStatus_1_3(const armnn_driver::hal_1_3::HalPolicy::Model& model, + armnn_driver::ArmnnDriver& driver, + V1_3::ErrorStatus& prepareStatus); + +template +android::sp PrepareModel_1_3(const HalModel& model, + armnn_driver::ArmnnDriver& driver) +{ + V1_3::ErrorStatus prepareStatus = V1_3::ErrorStatus::NONE; + return PrepareModelWithStatus_1_3(model, driver, prepareStatus); +} + +#endif + +template +void AddTensorOperand(HalModel& model, + const hidl_vec& dimensions, + const T* values, + HalOperandType operandType = HalOperandType::TENSOR_FLOAT32, + HalOperandLifeTime operandLifeTime = V1_0::OperandLifeTime::CONSTANT_COPY, + double scale = 0.f, + int offset = 0, + uint32_t numberOfConsumers = 1) +{ + using HalOperand = typename HalPolicy::Operand; + + uint32_t totalElements = 1; + for (uint32_t dim : dimensions) + { + totalElements *= dim; + } + + DataLocation location = {}; + location.length = totalElements * sizeof(T); + + if(operandLifeTime == HalOperandLifeTime::CONSTANT_COPY) + { + location.offset = model.operandValues.size(); + } + + HalOperand op = {}; + op.type = operandType; + op.dimensions = dimensions; + op.scale = scale; + op.zeroPoint = offset; + op.lifetime = HalOperandLifeTime::CONSTANT_COPY; + op.location = location; + op.numberOfConsumers = numberOfConsumers; + + model.operandValues.resize(model.operandValues.size() + location.length); + for (uint32_t i = 0; i < totalElements; i++) + { + *(reinterpret_cast(&model.operandValues[location.offset]) + i) = values[i]; + } + + AddOperand(model, op); +} + +template +void AddTensorOperand(HalModel& model, + const hidl_vec& dimensions, + const std::vector& values, + HalOperandType operandType = HalPolicy::OperandType::TENSOR_FLOAT32, + HalOperandLifeTime operandLifeTime = V1_0::OperandLifeTime::CONSTANT_COPY, + double scale = 0.f, + int offset = 0, + uint32_t numberOfConsumers = 1) +{ + AddTensorOperand(model, + dimensions, + values.data(), + operandType, + operandLifeTime, + scale, + offset, + numberOfConsumers); +} + +template +void AddIntOperand(HalModel& model, int32_t value, uint32_t numberOfConsumers = 1) +{ + using HalOperand = typename HalPolicy::Operand; + using HalOperandType = typename HalPolicy::OperandType; + using HalOperandLifeTime = typename HalPolicy::OperandLifeTime; + + DataLocation location = {}; + location.offset = model.operandValues.size(); + location.length = sizeof(int32_t); + + HalOperand op = {}; + op.type = HalOperandType::INT32; + op.dimensions = hidl_vec{}; + op.lifetime = HalOperandLifeTime::CONSTANT_COPY; + op.location = location; + op.numberOfConsumers = numberOfConsumers; + + model.operandValues.resize(model.operandValues.size() + location.length); + *reinterpret_cast(&model.operandValues[location.offset]) = value; + + AddOperand(model, op); +} + +template +void AddFloatOperand(HalModel& model, + float value, + uint32_t numberOfConsumers = 1) +{ + using HalOperand = typename HalPolicy::Operand; + using HalOperandType = typename HalPolicy::OperandType; + using HalOperandLifeTime = typename HalPolicy::OperandLifeTime; + + DataLocation location = {}; + location.offset = model.operandValues.size(); + location.length = sizeof(float); + + HalOperand op = {}; + op.type = HalOperandType::FLOAT32; + op.dimensions = hidl_vec{}; + op.lifetime = HalOperandLifeTime::CONSTANT_COPY; + op.location = location; + op.numberOfConsumers = numberOfConsumers; + + model.operandValues.resize(model.operandValues.size() + location.length); + *reinterpret_cast(&model.operandValues[location.offset]) = value; + + AddOperand(model, op); +} V1_0::ErrorStatus Execute(android::sp preparedModel, const V1_0::Request& request, -- cgit v1.2.1