From d6539c58519962acd8967e93ceb2da049631c832 Mon Sep 17 00:00:00 2001 From: Sadik Armagan Date: Wed, 22 May 2019 18:00:30 +0100 Subject: IVGCVSW-2911 Add Android Q support to android-nn-driver infrastructure * Updated Android.mk to build Android Q * Added androidnn.go to inject cpp flags for Q * Create Runtime when ACL is not enabled Change-Id: Ia3e7a8e484fc81ce63998a65e29753cbf941173c Signed-off-by: Sadik Armagan Signed-off-by: Kevin May --- Android.bp | 49 +++++++++++++++---- Android.mk | 130 ++++++++++++++++++++++++++++++++++++++++++++----- ArmnnDevice.cpp | 12 ++--- Utils.hpp | 4 +- androidnn.go | 44 +++++++++++++++++ test/1.1/Mean.cpp | 4 +- test/1.1/Transpose.cpp | 4 +- test/Android.mk | 51 ++++++++++++++++--- 8 files changed, 259 insertions(+), 39 deletions(-) create mode 100644 androidnn.go diff --git a/Android.bp b/Android.bp index f6ccb099..4a997929 100644 --- a/Android.bp +++ b/Android.bp @@ -3,6 +3,40 @@ // SPDX-License-Identifier: MIT // +bootstrap_go_package { + name: "armnn_nn_driver", + pkgPath: "android-nn-driver", + deps: [ + "blueprint", + "blueprint-pathtools", + "blueprint-proptools", + "soong", + "soong-android", + "soong-cc", + ], + srcs: [ + "androidnn.go", + ], + pluginFor: [ "soong_build" ], +} + +armnn_nn_driver_defaults { + name: "armnn-nn-driver-default-cppflags", + cppflags: [ + "-std=c++14", + "-fexceptions", + "-DBOOST_NO_AUTO_PTR", + "-DEMBEDDED_KERNELS", + "-DARM_COMPUTE_ASSERTS_ENABLED", + "-DARM_COMPUTE_CPP_SCHEDULER", + "-Wno-unused-parameter", + "-DNO_DOT_IN_TOOLCHAIN", + + "-no-integrated-as" + ], + rtti: true, +} + //////////////////////////////////////////// // // // Arm Compute // @@ -10,6 +44,7 @@ //////////////////////////////////////////// cc_library_static { name: "armnn-arm_compute", + defaults: ["armnn-nn-driver-default-cppflags"], proprietary: true, local_include_dirs: ["clframework/build/android-arm64v8a/src/core", "clframework/build/android-arm64v8a/src/core/CL", @@ -698,16 +733,6 @@ cc_library_static { ], }, }, - cppflags: [ - "-std=c++14", - "-fexceptions", - "-DEMBEDDED_KERNELS", - "-DARM_COMPUTE_ASSERTS_ENABLED", - "-DARM_COMPUTE_CPP_SCHEDULER", - "-Wno-unused-parameter", - "-DNO_DOT_IN_TOOLCHAIN", - "-no-integrated-as" - ], rtti: true, } @@ -724,6 +749,10 @@ cc_defaults { "-O3", "-fexceptions", "-Wno-unused-parameter", + "-DBOOST_NO_AUTO_PTR" + ], + cppflags: [ + "-std=c++14" ], rtti: true, } diff --git a/Android.mk b/Android.mk index 3d23ecc7..8d2fe9f7 100644 --- a/Android.mk +++ b/Android.mk @@ -6,6 +6,25 @@ ANDROID_NN_DRIVER_LOCAL_PATH := $(call my-dir) LOCAL_PATH := $(ANDROID_NN_DRIVER_LOCAL_PATH) +P_OR_LATER := 0 +Q_OR_LATER := 0 + +ifeq ($(PLATFORM_VERSION),9) +P_OR_LATER := 1 +endif # PLATFORM_VERSION == 9 +ifeq ($(PLATFORM_VERSION),P) +P_OR_LATER := 1 +endif # PLATFORM_VERSION == P + +ifeq ($(PLATFORM_VERSION),10) +P_OR_LATER := 1 +Q_OR_LATER := 1 +endif # PLATFORM_VERSION == 10 +ifeq ($(PLATFORM_VERSION),Q) +P_OR_LATER := 1 +Q_OR_LATER := 1 +endif # PLATFORM_VERSION == Q + # Configure these paths if you move the source or Khronos headers ARMNN_HEADER_PATH := $(LOCAL_PATH)/armnn/include ARMNN_UTILS_HEADER_PATH := $(LOCAL_PATH)/armnn/src/armnnUtils @@ -17,13 +36,26 @@ NN_HEADER_PATH := $(LOCAL_PATH)/../../../frameworks/ml/nn/runtime/include ARMNN_COMPUTE_CL_ENABLED := 1 ARMNN_COMPUTE_NEON_ENABLED := 1 +ifeq ($(ARMNN_COMPUTE_CL_ENABLE),0) +ARMNN_COMPUTE_CL_ENABLED := 0 +endif + +ifeq ($(ARMNN_COMPUTE_NEON_ENABLE),0) +ARMNN_COMPUTE_NEON_ENABLED := 0 +endif + ####################### # libarmnn-driver@1.0 # ####################### include $(CLEAR_VARS) LOCAL_MODULE := libarmnn-driver@1.0 +ifeq ($(Q_OR_LATER),1) +# "eng" is deprecated in Android Q +LOCAL_MODULE_TAGS := optional +else LOCAL_MODULE_TAGS := eng optional +endif LOCAL_ARM_MODE := arm LOCAL_PROPRIETARY_MODULE := true # Mark source files as dependent on Android.mk @@ -40,20 +72,24 @@ LOCAL_CFLAGS := \ -fexceptions \ -Werror \ -Wno-format-security -ifeq ($(PLATFORM_VERSION),9) + +ifeq ($(P_OR_LATER),1) # Required to build with the changes made to the Android ML framework starting from Android P, # regardless of the HAL version used for the build. LOCAL_CFLAGS+= \ -DARMNN_ANDROID_P endif # PLATFORM_VERSION == 9 + ifeq ($(ARMNN_DRIVER_DEBUG),1) LOCAL_CFLAGS+= \ -UNDEBUG endif # ARMNN_DRIVER_DEBUG == 1 + ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1) LOCAL_CFLAGS += \ -DARMCOMPUTECL_ENABLED endif # ARMNN_COMPUTE_CL_ENABLED == 1 + ifeq ($(ARMNN_COMPUTE_NEON_ENABLED),1) LOCAL_CFLAGS += \ -DARMCOMPUTENEON_ENABLED @@ -90,18 +126,32 @@ LOCAL_SHARED_LIBRARIES := \ libutils \ android.hardware.neuralnetworks@1.0 \ android.hidl.allocator@1.0 \ - android.hidl.memory@1.0 \ - libOpenCL -ifeq ($(PLATFORM_VERSION),9) + android.hidl.memory@1.0 + +ifeq ($(P_OR_LATER),1) # Required to build the 1.0 version of the NN Driver on Android P and later versions, # as the 1.0 version of the NN API needs the 1.1 HAL headers to be included regardless. LOCAL_SHARED_LIBRARIES+= \ android.hardware.neuralnetworks@1.1 endif # PLATFORM_VERSION == 9 +ifeq ($(Q_OR_LATER),1) +LOCAL_SHARED_LIBRARIES+= \ + libnativewindow \ + libui \ + libfmq \ + libcutils \ + android.hardware.neuralnetworks@1.2 +endif # PLATFORM_VERSION == Q + +ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1) +LOCAL_SHARED_LIBRARIES+= \ + libOpenCL +endif + include $(BUILD_STATIC_LIBRARY) -ifeq ($(PLATFORM_VERSION),9) +ifeq ($(P_OR_LATER),1) # The following target is available starting from Android P ####################### @@ -110,7 +160,13 @@ ifeq ($(PLATFORM_VERSION),9) include $(CLEAR_VARS) LOCAL_MODULE := libarmnn-driver@1.1 +ifeq ($(Q_OR_LATER),1) +# "eng" is deprecated in Android Q +LOCAL_MODULE_TAGS := optional +else LOCAL_MODULE_TAGS := eng optional +endif +#PRODUCT_PACKAGES_ENG := libarmnn-driver@1.1 LOCAL_ARM_MODE := arm LOCAL_PROPRIETARY_MODULE := true # Mark source files as dependent on Android.mk @@ -129,14 +185,17 @@ LOCAL_CFLAGS := \ -Wno-format-security \ -DARMNN_ANDROID_P \ -DARMNN_ANDROID_NN_V1_1 + ifeq ($(ARMNN_DRIVER_DEBUG),1) LOCAL_CFLAGS+= \ -UNDEBUG endif # ARMNN_DRIVER_DEBUG == 1 + ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1) LOCAL_CFLAGS += \ -DARMCOMPUTECL_ENABLED endif # ARMNN_COMPUTE_CL_ENABLED == 1 + ifeq ($(ARMNN_COMPUTE_NEON_ENABLED),1) LOCAL_CFLAGS += \ -DARMCOMPUTENEON_ENABLED @@ -176,8 +235,21 @@ LOCAL_SHARED_LIBRARIES := \ android.hardware.neuralnetworks@1.0 \ android.hardware.neuralnetworks@1.1 \ android.hidl.allocator@1.0 \ - android.hidl.memory@1.0 \ + android.hidl.memory@1.0 + +ifeq ($(Q_OR_LATER),1) +LOCAL_SHARED_LIBRARIES+= \ + libnativewindow \ + libui \ + libfmq \ + libcutils \ + android.hardware.neuralnetworks@1.2 +endif # PLATFORM_VERSION == Q + +ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1) +LOCAL_SHARED_LIBRARIES+= \ libOpenCL +endif include $(BUILD_STATIC_LIBRARY) @@ -190,7 +262,12 @@ include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.neuralnetworks@1.0-service-armnn LOCAL_INIT_RC := android.hardware.neuralnetworks@1.0-service-armnn.rc +ifeq ($(Q_OR_LATER),1) +# "eng" is deprecated in Android Q +LOCAL_MODULE_TAGS := optional +else LOCAL_MODULE_TAGS := eng optional +endif LOCAL_ARM_MODE := arm LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_PROPRIETARY_MODULE := true @@ -235,18 +312,31 @@ LOCAL_SHARED_LIBRARIES := \ libutils \ android.hardware.neuralnetworks@1.0 \ android.hidl.allocator@1.0 \ - android.hidl.memory@1.0 \ - libOpenCL -ifeq ($(PLATFORM_VERSION),9) + android.hidl.memory@1.0 + +ifeq ($(P_OR_LATER),1) # Required to build the 1.0 version of the NN Driver on Android P and later versions, # as the 1.0 version of the NN API needs the 1.1 HAL headers to be included regardless. LOCAL_SHARED_LIBRARIES+= \ android.hardware.neuralnetworks@1.1 endif # PLATFORM_VERSION == 9 +ifeq ($(Q_OR_LATER),1) +LOCAL_SHARED_LIBRARIES+= \ + libnativewindow \ + libui \ + libfmq \ + libcutils \ + android.hardware.neuralnetworks@1.2 +endif # PLATFORM_VERSION == Q + +ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1) +LOCAL_SHARED_LIBRARIES+= \ + libOpenCL +endif include $(BUILD_EXECUTABLE) -ifeq ($(PLATFORM_VERSION),9) +ifeq ($(P_OR_LATER),1) # The following target is available starting from Android P ##################################################### @@ -256,7 +346,12 @@ include $(CLEAR_VARS) LOCAL_MODULE := android.hardware.neuralnetworks@1.1-service-armnn LOCAL_INIT_RC := android.hardware.neuralnetworks@1.1-service-armnn.rc +ifeq ($(Q_OR_LATER),1) +# "eng" is deprecated in Android Q +LOCAL_MODULE_TAGS := optional +else LOCAL_MODULE_TAGS := eng optional +endif LOCAL_ARM_MODE := arm LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_PROPRIETARY_MODULE := true @@ -303,8 +398,21 @@ LOCAL_SHARED_LIBRARIES := \ android.hardware.neuralnetworks@1.0 \ android.hardware.neuralnetworks@1.1 \ android.hidl.allocator@1.0 \ - android.hidl.memory@1.0 \ + android.hidl.memory@1.0 + +ifeq ($(Q_OR_LATER),1) +LOCAL_SHARED_LIBRARIES+= \ + libnativewindow \ + libui \ + libfmq \ + libcutils \ + android.hardware.neuralnetworks@1.2 +endif # PLATFORM_VERSION == Q + +ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1) +LOCAL_SHARED_LIBRARIES+= \ libOpenCL +endif include $(BUILD_EXECUTABLE) diff --git a/ArmnnDevice.cpp b/ArmnnDevice.cpp index c96798a8..a03d9cc9 100644 --- a/ArmnnDevice.cpp +++ b/ArmnnDevice.cpp @@ -51,10 +51,11 @@ ArmnnDevice::ArmnnDevice(DriverOptions options) SetMinimumLogSeverity(base::INFO); } + armnn::IRuntime::CreationOptions runtimeOptions; + #if defined(ARMCOMPUTECL_ENABLED) try { - armnn::IRuntime::CreationOptions options; if (!m_Options.GetClTunedParametersFile().empty()) { m_ClTunedParameters = armnn::IGpuAccTunedParameters::Create(m_Options.GetClTunedParametersMode(), @@ -69,18 +70,17 @@ ArmnnDevice::ArmnnDevice(DriverOptions options) ALOGW("ArmnnDevice: Failed to load CL tuned parameters file '%s': %s", m_Options.GetClTunedParametersFile().c_str(), error.what()); } - options.m_GpuAccTunedParameters = m_ClTunedParameters; + runtimeOptions.m_GpuAccTunedParameters = m_ClTunedParameters; } - - options.m_EnableGpuProfiling = m_Options.IsGpuProfilingEnabled(); - - m_Runtime = armnn::IRuntime::Create(options); } catch (const armnn::ClRuntimeUnavailableException& error) { ALOGE("ArmnnDevice: Failed to setup CL runtime: %s. Device will be unavailable.", error.what()); } #endif + runtimeOptions.m_EnableGpuProfiling = m_Options.IsGpuProfilingEnabled(); + m_Runtime = armnn::IRuntime::Create(runtimeOptions); + std::vector backends; if (m_Runtime) diff --git a/Utils.hpp b/Utils.hpp index e55d8f80..42fef3fb 100644 --- a/Utils.hpp +++ b/Utils.hpp @@ -29,12 +29,12 @@ extern const armnn::PermutationVector g_DontPermute; class UnsupportedOperand: public std::runtime_error { public: - UnsupportedOperand(const OperandType type) + UnsupportedOperand(const V1_0::OperandType type) : std::runtime_error("Operand type is unsupported") , m_type(type) {} - OperandType m_type; + V1_0::OperandType m_type; }; /// Swizzles tensor data in @a input according to the dimension mappings. diff --git a/androidnn.go b/androidnn.go new file mode 100644 index 00000000..aa83b1aa --- /dev/null +++ b/androidnn.go @@ -0,0 +1,44 @@ +// +// Copyright © 2017 ARM Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +package armnn_nn_driver + +import ( + "android/soong/android" + "android/soong/cc" +) + +func globalFlags(ctx android.BaseContext) []string { + var cppflags []string + + if ctx.AConfig().PlatformVersionName() == "Q" { + cppflags = append(cppflags, "-fno-addrsig") + } + + return cppflags +} + +func armnnNNDriverDefaults(ctx android.LoadHookContext) { + type props struct { + Cppflags []string + } + + p := &props{} + p.Cppflags = globalFlags(ctx) + + ctx.AppendProperties(p) +} + +func init() { + + android.RegisterModuleType("armnn_nn_driver_defaults", armnnNNDriverDefaultsFactory) +} + +func armnnNNDriverDefaultsFactory() android.Module { + + module := cc.DefaultsFactory() + android.AddLoadHook(module, armnnNNDriverDefaults) + return module +} diff --git a/test/1.1/Mean.cpp b/test/1.1/Mean.cpp index 4ebb8cfa..7d482433 100644 --- a/test/1.1/Mean.cpp +++ b/test/1.1/Mean.cpp @@ -32,7 +32,7 @@ void MeanTestImpl(const TestTensor& input, V1_1::Model model = {}; AddInputOperand (model, input.GetDimensions()); - AddTensorOperand(model, axisDimensions, const_cast(axisValues), OperandType::TENSOR_INT32); + AddTensorOperand(model, axisDimensions, const_cast(axisValues), V1_0::OperandType::TENSOR_INT32); AddIntOperand (model, keepDims); AddOutputOperand(model, expectedOutput.GetDimensions()); @@ -42,7 +42,7 @@ void MeanTestImpl(const TestTensor& input, model.operations[0].outputs = hidl_vec{ 3 }; model.relaxComputationFloat32toFloat16 = fp16Enabled; - android::sp preparedModel = PrepareModel(model, *driver); + android::sp preparedModel = PrepareModel(model, *driver); // The request's memory pools will follow the same order as the inputs DataLocation inLoc = {}; diff --git a/test/1.1/Transpose.cpp b/test/1.1/Transpose.cpp index a0521436..6dc3e0ee 100644 --- a/test/1.1/Transpose.cpp +++ b/test/1.1/Transpose.cpp @@ -30,7 +30,7 @@ void TransposeTestImpl(const TestTensor & inputs, int32_t perm[], V1_1::Model model = {}; AddInputOperand(model,inputs.GetDimensions()); - AddTensorOperand(model, hidl_vec{4}, perm, OperandType::TENSOR_INT32); + AddTensorOperand(model, hidl_vec{4}, perm, V1_0::OperandType::TENSOR_INT32); AddOutputOperand(model, expectedOutputTensor.GetDimensions()); model.operations.resize(1); @@ -38,7 +38,7 @@ void TransposeTestImpl(const TestTensor & inputs, int32_t perm[], model.operations[0].inputs = hidl_vec{0, 1}; model.operations[0].outputs = hidl_vec{2}; - android::sp preparedModel = PrepareModel(model, *driver); + android::sp preparedModel = PrepareModel(model, *driver); // the request's memory pools will follow the same order as // the inputs diff --git a/test/Android.mk b/test/Android.mk index 87f0b636..820cfd61 100644 --- a/test/Android.mk +++ b/test/Android.mk @@ -18,7 +18,12 @@ ARMNN_DRIVER_HEADER_PATH := $(LOCAL_PATH)/.. include $(CLEAR_VARS) LOCAL_MODULE := armnn-driver-tests@1.0 +ifeq ($(PLATFORM_VERSION),Q) +# "eng" is deprecated in Android Q +LOCAL_MODULE_TAGS := optional +else LOCAL_MODULE_TAGS := eng optional +endif LOCAL_ARM_MODE := arm LOCAL_PROPRIETARY_MODULE := true # Mark source files as dependent on Android.mk @@ -36,7 +41,8 @@ LOCAL_CFLAGS := \ -Werror \ -O0 \ -UNDEBUG -ifeq ($(PLATFORM_VERSION),9) + +ifeq ($(P_OR_LATER),1) # Required to build with the changes made to the Android ML framework starting from Android P, # regardless of the HAL version used for the build. LOCAL_CFLAGS+= \ @@ -78,18 +84,32 @@ LOCAL_SHARED_LIBRARIES := \ libutils \ android.hardware.neuralnetworks@1.0 \ android.hidl.allocator@1.0 \ - android.hidl.memory@1.0 \ - libOpenCL -ifeq ($(PLATFORM_VERSION),9) + android.hidl.memory@1.0 + +ifeq ($(P_OR_LATER),1) # Required to build the 1.0 version of the NN Driver on Android P and later versions, # as the 1.0 version of the NN API needs the 1.1 HAL headers to be included regardless. LOCAL_SHARED_LIBRARIES+= \ android.hardware.neuralnetworks@1.1 endif # PLATFORM_VERSION == 9 +ifeq ($(Q_OR_LATER),1) +LOCAL_SHARED_LIBRARIES+= \ + libnativewindow \ + libui \ + libfmq \ + libcutils \ + android.hardware.neuralnetworks@1.2 +endif # PLATFORM_VERSION == Q + +ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1) +LOCAL_SHARED_LIBRARIES+= \ + libOpenCL +endif + include $(BUILD_EXECUTABLE) -ifeq ($(PLATFORM_VERSION),9) +ifeq ($(P_OR_LATER),1) # The following target is available starting from Android P ########################## @@ -98,7 +118,13 @@ ifeq ($(PLATFORM_VERSION),9) include $(CLEAR_VARS) LOCAL_MODULE := armnn-driver-tests@1.1 +ifeq ($(PLATFORM_VERSION),Q) +# "eng" is deprecated in Android Q +LOCAL_MODULE_TAGS := optional +else LOCAL_MODULE_TAGS := eng optional +endif +#PRODUCT_PACKAGES_ENG := libarmnn LOCAL_ARM_MODE := arm LOCAL_PROPRIETARY_MODULE := true # Mark source files as dependent on Android.mk @@ -157,8 +183,21 @@ LOCAL_SHARED_LIBRARIES := \ android.hardware.neuralnetworks@1.0 \ android.hardware.neuralnetworks@1.1 \ android.hidl.allocator@1.0 \ - android.hidl.memory@1.0 \ + android.hidl.memory@1.0 + +ifeq ($(Q_OR_LATER),1) +LOCAL_SHARED_LIBRARIES+= \ + libnativewindow \ + libui \ + libfmq \ + libcutils \ + android.hardware.neuralnetworks@1.2 +endif # PLATFORM_VERSION == Q + +ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1) +LOCAL_SHARED_LIBRARIES+= \ libOpenCL +endif include $(BUILD_EXECUTABLE) -- cgit v1.2.1