diff options
Diffstat (limited to 'test/DriverTestHelpers.hpp')
-rw-r--r-- | test/DriverTestHelpers.hpp | 361 |
1 files changed, 258 insertions, 103 deletions
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<V1_0::IPreparedModel> 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<void> notify(V1_0::ErrorStatus status, const android::sp<V1_0::IPreparedModel>& preparedModel) override; + + Return<void> notify_1_2(V1_0::ErrorStatus status, const android::sp<V1_2::IPreparedModel>& preparedModel) override; + + Return<void> notify_1_3(V1_3::ErrorStatus status, const android::sp<V1_3::IPreparedModel>& 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<V1_0::IPreparedModel> GetPreparedModel() { return m_PreparedModel; } + + android::sp<V1_2::IPreparedModel> GetPreparedModel_1_2() { return m_PreparedModel_1_2; } + + android::sp<V1_3::IPreparedModel> 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<V1_0::IPreparedModel> m_PreparedModel; + android::sp<V1_2::IPreparedModel> m_PreparedModel_1_2; + android::sp<V1_3::IPreparedModel> m_PreparedModel_1_3; +}; + +#endif + hidl_memory allocateSharedMemory(int64_t size); template<typename T> @@ -142,30 +196,6 @@ void AddOperand(HalModel& model, const HalOperand& op) } template<typename HalPolicy, typename HalModel = typename HalPolicy::Model> -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<uint32_t>{}; - op.lifetime = HalOperandLifeTime::CONSTANT_COPY; - op.location = location; - op.numberOfConsumers = numberOfConsumers; - - model.operandValues.resize(model.operandValues.size() + location.length); - *reinterpret_cast<int32_t*>(&model.operandValues[location.offset]) = value; - - AddOperand<HalPolicy>(model, op); -} - -template<typename HalPolicy, typename HalModel = typename HalPolicy::Model> void AddBoolOperand(HalModel& model, bool value, uint32_t numberOfConsumers = 1) { using HalOperand = typename HalPolicy::Operand; @@ -199,80 +229,8 @@ template<> OperandType TypeToOperandType<int32_t>(); template<typename HalPolicy, - typename T, - typename HalModel = typename HalPolicy::Model, - typename HalOperandType = typename HalPolicy::OperandType, - typename HalOperandLifeTime = typename HalPolicy::OperandLifeTime> -void AddTensorOperand(HalModel& model, - const hidl_vec<uint32_t>& 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<T*>(&model.operandValues[location.offset]) + i) = values[i]; - } - - AddOperand<HalPolicy>(model, op); -} - -template<typename HalPolicy, - typename T, - typename HalModel = typename HalPolicy::Model, - typename HalOperandType = typename HalPolicy::OperandType, - typename HalOperandLifeTime = typename HalPolicy::OperandLifeTime> -void AddTensorOperand(HalModel& model, - const hidl_vec<uint32_t>& dimensions, - const std::vector<T>& 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<HalPolicy, T>(model, - dimensions, - values.data(), - operandType, - operandLifeTime, - scale, - offset, - numberOfConsumers); -} - -template<typename HalPolicy, - typename HalModel = typename HalPolicy::Model, - typename HalOperandType = typename HalPolicy::OperandType> + typename HalModel = typename HalPolicy::Model, + typename HalOperandType = typename HalPolicy::OperandType> void AddInputOperand(HalModel& model, const hidl_vec<uint32_t>& dimensions, HalOperandType operandType = HalOperandType::TENSOR_FLOAT32, @@ -298,8 +256,8 @@ void AddInputOperand(HalModel& model, } template<typename HalPolicy, - typename HalModel = typename HalPolicy::Model, - typename HalOperandType = typename HalPolicy::OperandType> + typename HalModel = typename HalPolicy::Model, + typename HalOperandType = typename HalPolicy::OperandType> void AddOutputOperand(HalModel& model, const hidl_vec<uint32_t>& dimensions, HalOperandType operandType = HalOperandType::TENSOR_FLOAT32, @@ -329,7 +287,7 @@ android::sp<V1_0::IPreparedModel> 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<V1_0::IPreparedModel> PrepareModelWithStatus(const V1_1::Model& model, armnn_driver::ArmnnDriver& driver, @@ -346,7 +304,7 @@ android::sp<V1_0::IPreparedModel> 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<V1_2::IPreparedModel> PrepareModelWithStatus_1_2(const armnn_driver::hal_1_2::HalPolicy::Model& model, armnn_driver::ArmnnDriver& driver, @@ -363,6 +321,203 @@ android::sp<V1_2::IPreparedModel> PrepareModel_1_2(const HalModel& model, #endif +#ifdef ARMNN_ANDROID_NN_V1_3 + +template<typename HalPolicy> +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<typename HalPolicy> +void AddInputOperand(armnn_driver::hal_1_3::HalPolicy::Model& model, + const hidl_vec<uint32_t>& 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<HalPolicy>(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<typename HalPolicy> +void AddOutputOperand(armnn_driver::hal_1_3::HalPolicy::Model& model, + const hidl_vec<uint32_t>& 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<HalPolicy>(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<V1_3::IPreparedModel> PrepareModelWithStatus_1_3(const armnn_driver::hal_1_3::HalPolicy::Model& model, + armnn_driver::ArmnnDriver& driver, + V1_3::ErrorStatus& prepareStatus); + +template<typename HalModel> +android::sp<V1_3::IPreparedModel> 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<typename HalPolicy, + typename T, + typename HalModel = typename HalPolicy::Model, + typename HalOperandType = typename HalPolicy::OperandType, + typename HalOperandLifeTime = typename HalPolicy::OperandLifeTime> +void AddTensorOperand(HalModel& model, + const hidl_vec<uint32_t>& 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<T*>(&model.operandValues[location.offset]) + i) = values[i]; + } + + AddOperand<HalPolicy>(model, op); +} + +template<typename HalPolicy, + typename T, + typename HalModel = typename HalPolicy::Model, + typename HalOperandType = typename HalPolicy::OperandType, + typename HalOperandLifeTime = typename HalPolicy::OperandLifeTime> +void AddTensorOperand(HalModel& model, + const hidl_vec<uint32_t>& dimensions, + const std::vector<T>& 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<HalPolicy, T>(model, + dimensions, + values.data(), + operandType, + operandLifeTime, + scale, + offset, + numberOfConsumers); +} + +template<typename HalPolicy, typename HalModel = typename HalPolicy::Model> +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<uint32_t>{}; + op.lifetime = HalOperandLifeTime::CONSTANT_COPY; + op.location = location; + op.numberOfConsumers = numberOfConsumers; + + model.operandValues.resize(model.operandValues.size() + location.length); + *reinterpret_cast<int32_t*>(&model.operandValues[location.offset]) = value; + + AddOperand<HalPolicy>(model, op); +} + +template<typename HalPolicy, typename HalModel = typename HalPolicy::Model> +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<uint32_t>{}; + op.lifetime = HalOperandLifeTime::CONSTANT_COPY; + op.location = location; + op.numberOfConsumers = numberOfConsumers; + + model.operandValues.resize(model.operandValues.size() + location.length); + *reinterpret_cast<float*>(&model.operandValues[location.offset]) = value; + + AddOperand<HalPolicy>(model, op); +} V1_0::ErrorStatus Execute(android::sp<V1_0::IPreparedModel> preparedModel, const V1_0::Request& request, |