From b5fdf38f0c6596958fab2b84882f2792a31e585a Mon Sep 17 00:00:00 2001 From: Mike Kelly Date: Tue, 11 Jun 2019 16:35:25 +0100 Subject: IVGCVSW-3181 Add HAL 1.2 support to android-nn-driver * Updated Android.mk to build HAL 1.2 driver * Added 1.2 HalPolicy and ArmnnDriver * Added 1.2 ArmnnPreparedModel * Updated converters and utilities to accept new HAL 1.2 operands and operand types. Signed-off-by: Sadik Armagan Signed-off-by: Mike Kelly Change-Id: I62856deab24e106f72cccce09468db4971756fa6 --- 1.2/ArmnnDriver.hpp | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 1.2/ArmnnDriver.hpp (limited to '1.2/ArmnnDriver.hpp') diff --git a/1.2/ArmnnDriver.hpp b/1.2/ArmnnDriver.hpp new file mode 100644 index 00000000..7460f396 --- /dev/null +++ b/1.2/ArmnnDriver.hpp @@ -0,0 +1,208 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +#include "../ArmnnDevice.hpp" +#include "ArmnnDriverImpl.hpp" +#include "HalPolicy.hpp" + +#include "../ArmnnDriverImpl.hpp" +#include "../1.2/ArmnnDriverImpl.hpp" +#include "../1.2/HalPolicy.hpp" +#include "../1.1/ArmnnDriverImpl.hpp" +#include "../1.1/HalPolicy.hpp" +#include "../1.0/ArmnnDriverImpl.hpp" +#include "../1.0/HalPolicy.hpp" + +#include + +namespace armnn_driver +{ +namespace hal_1_2 +{ + +class ArmnnDriver : public ArmnnDevice, public V1_2::IDevice +{ +public: + ArmnnDriver(DriverOptions options) + : ArmnnDevice(std::move(options)) + { + ALOGV("hal_1_2::ArmnnDriver::ArmnnDriver()"); + } + ~ArmnnDriver() {} + + using HidlToken = android::hardware::hidl_array; + +public: + Return getCapabilities(V1_0::IDevice::getCapabilities_cb cb) override + { + ALOGV("hal_1_2::ArmnnDriver::getCapabilities()"); + + return hal_1_0::ArmnnDriverImpl::getCapabilities(m_Runtime, cb); + } + + Return getSupportedOperations(const V1_0::Model& model, + V1_0::IDevice::getSupportedOperations_cb cb) override + { + ALOGV("hal_1_2::ArmnnDriver::getSupportedOperations()"); + + return armnn_driver::ArmnnDriverImpl::getSupportedOperations(m_Runtime, + m_Options, + model, + cb); + } + + Return prepareModel(const V1_0::Model& model, + const android::sp& cb) override + { + ALOGV("hal_1_2::ArmnnDriver::prepareModel()"); + + return armnn_driver::ArmnnDriverImpl::prepareModel(m_Runtime, + m_ClTunedParameters, + m_Options, + model, + cb); + } + + Return getCapabilities_1_1(V1_1::IDevice::getCapabilities_1_1_cb cb) override + { + ALOGV("hal_1_2::ArmnnDriver::getCapabilities_1_1()"); + + return hal_1_1::ArmnnDriverImpl::getCapabilities_1_1(m_Runtime, cb); + } + + Return getSupportedOperations_1_1(const V1_1::Model& model, + V1_1::IDevice::getSupportedOperations_1_1_cb cb) override + { + ALOGV("hal_1_2::ArmnnDriver::getSupportedOperations_1_1()"); + return armnn_driver::ArmnnDriverImpl::getSupportedOperations(m_Runtime, + m_Options, + model, + cb); + } + + Return prepareModel_1_1(const V1_1::Model& model, + V1_1::ExecutionPreference preference, + const android::sp& cb) override + { + ALOGV("hal_1_2::ArmnnDriver::prepareModel_1_1()"); + + if (!(preference == ExecutionPreference::LOW_POWER || + preference == ExecutionPreference::FAST_SINGLE_ANSWER || + preference == ExecutionPreference::SUSTAINED_SPEED)) + { + ALOGV("hal_1_2::ArmnnDriver::prepareModel_1_1: Invalid execution preference"); + cb->notify(ErrorStatus::INVALID_ARGUMENT, nullptr); + return ErrorStatus::INVALID_ARGUMENT; + } + + return armnn_driver::ArmnnDriverImpl::prepareModel(m_Runtime, + m_ClTunedParameters, + m_Options, + model, + cb, + model.relaxComputationFloat32toFloat16 + && m_Options.GetFp16Enabled()); + } + + Return getStatus() override + { + ALOGV("hal_1_2::ArmnnDriver::getStatus()"); + + return armnn_driver::ArmnnDriverImpl::getStatus(); + } + + Return getVersionString(getVersionString_cb cb) + { + ALOGV("hal_1_2::ArmnnDriver::getSupportedOperations()"); + + cb(ErrorStatus::NONE, "ArmNN"); + return Void(); + } + + Return getType(getType_cb cb) + { + ALOGV("hal_1_2::ArmnnDriver::getType()"); + + cb(ErrorStatus::NONE, V1_2::DeviceType::CPU); + return Void(); + } + + Return prepareModelFromCache( + const android::hardware::hidl_vec&, + const android::hardware::hidl_vec&, + const HidlToken&, + const sp& callback) + { + ALOGV("hal_1_2::ArmnnDriver::prepareModelFromCache()"); + callback->notify_1_2(ErrorStatus::GENERAL_FAILURE, nullptr); + return ErrorStatus::GENERAL_FAILURE; + } + + Return prepareModel_1_2(const V1_2::Model& model, V1_1::ExecutionPreference preference, + const android::hardware::hidl_vec&, + const android::hardware::hidl_vec&, const HidlToken&, + const android::sp& cb) + { + ALOGV("hal_1_2::ArmnnDriver::prepareModel_1_1()"); + + if (!(preference == ExecutionPreference::LOW_POWER || + preference == ExecutionPreference::FAST_SINGLE_ANSWER || + preference == ExecutionPreference::SUSTAINED_SPEED)) + { + ALOGV("hal_1_2::ArmnnDriver::prepareModel_1_1: Invalid execution preference"); + cb->notify(ErrorStatus::INVALID_ARGUMENT, nullptr); + return ErrorStatus::INVALID_ARGUMENT; + } + + return ArmnnDriverImpl::prepareArmnnModel_1_2(m_Runtime, + m_ClTunedParameters, + m_Options, + model, + cb, + model.relaxComputationFloat32toFloat16 + && m_Options.GetFp16Enabled()); + } + + Return getSupportedExtensions(getSupportedExtensions_cb cb) + { + ALOGV("hal_1_2::ArmnnDriver::getSupportedExtensions()"); + cb(ErrorStatus::NONE, {/* No extensions. */}); + return Void(); + } + + Return getCapabilities_1_2(getCapabilities_1_2_cb cb) + { + ALOGV("hal_1_2::ArmnnDriver::getCapabilities()"); + + return hal_1_2::ArmnnDriverImpl::getCapabilities_1_2(m_Runtime, cb); + } + + Return getSupportedOperations_1_2(const V1_2::Model& model, + getSupportedOperations_1_2_cb cb) + { + ALOGV("hal_1_2::ArmnnDriver::getSupportedOperations()"); + + return armnn_driver::ArmnnDriverImpl::getSupportedOperations(m_Runtime, + m_Options, + model, + cb); + } + + Return getNumberOfCacheFilesNeeded(getNumberOfCacheFilesNeeded_cb cb) + { + ALOGV("hal_1_2::ArmnnDriver::getSupportedExtensions()"); + + // Set both numbers to be 0 for cache not supported. + cb(ErrorStatus::NONE, 0, 0); + return Void(); + } +}; + +} // namespace hal_1_2 +} // namespace armnn_driver \ No newline at end of file -- cgit v1.2.1