From 188675fd7e7239f56212d72f8ac10598de87e76a Mon Sep 17 00:00:00 2001 From: Sadik Armagan Date: Fri, 12 Feb 2021 17:16:42 +0000 Subject: IVGCVSW-5665 Basic NN Driver support for next OS Version Signed-off-by: Kevin May Signed-off-by: Sadik Armagan Change-Id: I1e1db52322092c6b1b7ac6183c3adc90aabcec24 --- ArmnnPreparedModel_1_2.cpp | 77 ++++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 30 deletions(-) (limited to 'ArmnnPreparedModel_1_2.cpp') diff --git a/ArmnnPreparedModel_1_2.cpp b/ArmnnPreparedModel_1_2.cpp index c2148ba1..a2148c29 100644 --- a/ArmnnPreparedModel_1_2.cpp +++ b/ArmnnPreparedModel_1_2.cpp @@ -16,12 +16,16 @@ #include #include +#ifdef ARMNN_ANDROID_S +#include +#endif + using namespace android; using namespace android::hardware; namespace { -static const Timing g_NoTiming = {.timeOnDevice = UINT64_MAX, .timeInDriver = UINT64_MAX}; +static const V1_2::Timing g_NoTiming = {.timeOnDevice = UINT64_MAX, .timeInDriver = UINT64_MAX}; using namespace armnn_driver; using TimePoint = std::chrono::steady_clock::time_point; @@ -38,8 +42,8 @@ unsigned long MicrosecondsDuration(TimePoint endPoint, TimePoint startPoint) void NotifyCallbackAndCheck(const ::android::sp& callback, V1_0::ErrorStatus errorStatus, - std::vector, - const Timing, + std::vector, + const V1_2::Timing, std::string callingFunction) { Return returned = callback->notify(errorStatus); @@ -53,8 +57,8 @@ void NotifyCallbackAndCheck(const ::android::sp& callb void NotifyCallbackAndCheck(const ::android::sp& callback, V1_0::ErrorStatus errorStatus, - std::vector outputShapes, - const Timing timing, + std::vector outputShapes, + const V1_2::Timing timing, std::string callingFunction) { Return returned = callback->notify_1_2(errorStatus, outputShapes, timing); @@ -66,7 +70,7 @@ void NotifyCallbackAndCheck(const ::android::sp& callb } } -bool ValidateRequestArgument(const RequestArgument& requestArg, const armnn::TensorInfo& tensorInfo) +bool ValidateRequestArgument(const V1_0::RequestArgument& requestArg, const armnn::TensorInfo& tensorInfo) { if (requestArg.dimensions.size() != 0) { @@ -91,7 +95,7 @@ bool ValidateRequestArgument(const RequestArgument& requestArg, const armnn::Ten return true; } -armnn::Tensor GetTensorForRequestArgument(const RequestArgument& requestArg, +armnn::Tensor GetTensorForRequestArgument(const V1_0::RequestArgument& requestArg, const armnn::TensorInfo& tensorInfo, const std::vector<::android::nn::RunTimePoolInfo>& requestPools) { @@ -178,20 +182,20 @@ Return ArmnnPreparedModel_1_2::execute(const V1_ } auto cb = [callback](V1_0::ErrorStatus errorStatus, - std::vector outputShapes, - const Timing& timing, + std::vector outputShapes, + const V1_2::Timing& timing, std::string callingFunction) { NotifyCallbackAndCheck(callback, errorStatus, outputShapes, timing, callingFunction); }; - return Execute(request, MeasureTiming::NO, cb); + return Execute(request, V1_2::MeasureTiming::NO, cb); } template Return ArmnnPreparedModel_1_2::execute_1_2( const V1_0::Request& request, - MeasureTiming measureTiming, + V1_2::MeasureTiming measureTiming, const sp& callback) { if (callback.get() == nullptr) @@ -201,8 +205,8 @@ Return ArmnnPreparedModel_1_2::execute_1_2( } auto cb = [callback](V1_0::ErrorStatus errorStatus, - std::vector outputShapes, - const Timing& timing, + std::vector outputShapes, + const V1_2::Timing& timing, std::string callingFunction) { NotifyCallbackAndCheck(callback, errorStatus, outputShapes, timing, callingFunction); @@ -240,7 +244,7 @@ Return ArmnnPreparedModel_1_2::PrepareMemoryForIn template Return ArmnnPreparedModel_1_2::PrepareMemoryForOutputs( armnn::OutputTensors& outputs, - std::vector &outputShapes, + std::vector &outputShapes, const V1_0::Request& request, const std::vector& memPools) { @@ -265,13 +269,23 @@ Return ArmnnPreparedModel_1_2::PrepareMemoryForOu return V1_0::ErrorStatus::OUTPUT_INSUFFICIENT_SIZE; } +#if !defined(ARMNN_ANDROID_S) const size_t bufferSize = memPools.at(outputArg.location.poolIndex).getHidlMemory().size(); if (bufferSize < outputSize) { ALOGW("ArmnnPreparedModel_1_2::Execute failed: bufferSize < outputSize"); return V1_0::ErrorStatus::OUTPUT_INSUFFICIENT_SIZE; } - +#else + const size_t bufferSize = memPools.at(outputArg.location.poolIndex).getMemory().size; + if (bufferSize < outputSize) + { + ALOGW("ArmnnPreparedModel_1_2::Execute failed bufferSize (%s) < outputSize (%s)", + std::to_string(bufferSize).c_str(), std::to_string(outputSize).c_str()); + outputShapes[i].isSufficient = false; + return V1_0::ErrorStatus::OUTPUT_INSUFFICIENT_SIZE; + } +#endif outputs.emplace_back(i, outputTensor); outputShapes[i] = ComputeShape(outputTensorInfo); } @@ -287,12 +301,15 @@ Return ArmnnPreparedModel_1_2::PrepareMemoryForIO const V1_0::Request& request, CallbackAsync_1_2 callback) { +#if !defined(ARMNN_ANDROID_S) if (!setRunTimePoolInfosFromHidlMemories(&memPools, request.pools)) +#else + if (!setRunTimePoolInfosFromCanonicalMemories(&memPools, uncheckedConvert(request.pools))) +#endif { callback(V1_0::ErrorStatus::GENERAL_FAILURE, {}, g_NoTiming, "ArmnnPreparedModel_1_2::execute"); return V1_0::ErrorStatus::GENERAL_FAILURE; } - // add the inputs and outputs with their data try { @@ -302,7 +319,7 @@ Return ArmnnPreparedModel_1_2::PrepareMemoryForIO return V1_0::ErrorStatus::GENERAL_FAILURE; } - std::vector outputShapes(request.outputs.size()); + std::vector outputShapes(request.outputs.size()); auto errorStatus = PrepareMemoryForOutputs(outputs, outputShapes, request, memPools); if (errorStatus != V1_0::ErrorStatus::NONE) @@ -332,7 +349,7 @@ Return ArmnnPreparedModel_1_2::PrepareMemoryForIO template Return ArmnnPreparedModel_1_2::executeSynchronously(const V1_0::Request& request, - MeasureTiming measureTiming, + V1_2::MeasureTiming measureTiming, executeSynchronously_cb cb) { ALOGV("ArmnnPreparedModel_1_2::executeSynchronously(): %s", GetModelSummary(m_Model).c_str()); @@ -346,7 +363,7 @@ Return ArmnnPreparedModel_1_2::executeSynchronously(const V1_0 TimePoint driverStart; - if (measureTiming == MeasureTiming::YES) + if (measureTiming == V1_2::MeasureTiming::YES) { driverStart = Now(); } @@ -359,8 +376,8 @@ Return ArmnnPreparedModel_1_2::executeSynchronously(const V1_0 } auto cbWrapper = [cb](V1_0::ErrorStatus errorStatus, - std::vector outputShapes, - const Timing& timing, + std::vector outputShapes, + const V1_2::Timing& timing, std::string) { cb(errorStatus, outputShapes, timing); @@ -405,7 +422,7 @@ bool ArmnnPreparedModel_1_2::ExecuteGraph( DumpTensorsIfRequired("Input", inputTensors); - std::vector outputShapes(outputTensors.size()); + std::vector outputShapes(outputTensors.size()); for (unsigned int i = 0; i < outputTensors.size(); i++) { std::pair outputTensorPair = outputTensors[i]; @@ -418,14 +435,14 @@ bool ArmnnPreparedModel_1_2::ExecuteGraph( // run it try { - if (cb.ctx.measureTimings == MeasureTiming::YES) + if (cb.ctx.measureTimings == V1_2::MeasureTiming::YES) { deviceStart = Now(); } armnn::Status status = m_Runtime->EnqueueWorkload(m_NetworkId, inputTensors, outputTensors); - if (cb.ctx.measureTimings == MeasureTiming::YES) + if (cb.ctx.measureTimings == V1_2::MeasureTiming::YES) { deviceEnd = Now(); } @@ -454,10 +471,10 @@ bool ArmnnPreparedModel_1_2::ExecuteGraph( DumpTensorsIfRequired("Output", outputTensors); - if (cb.ctx.measureTimings == MeasureTiming::YES) + if (cb.ctx.measureTimings == V1_2::MeasureTiming::YES) { driverEnd = Now(); - Timing timing; + V1_2::Timing timing; timing.timeOnDevice = MicrosecondsDuration(deviceEnd, deviceStart); timing.timeInDriver = MicrosecondsDuration(driverEnd, cb.ctx.driverStart); ALOGV("ArmnnPreparedModel_1_2::execute timing - Device = %lu Driver = %lu", timing.timeOnDevice, @@ -494,10 +511,10 @@ bool ArmnnPreparedModel_1_2::ExecuteWithDummyInputs() outputTensors.emplace_back(i, outputTensor); } - auto nullCallback = [](V1_0::ErrorStatus, std::vector, const Timing&, std::string) {}; + auto nullCallback = [](V1_0::ErrorStatus, std::vector, const V1_2::Timing&, std::string) {}; CallbackContext_1_2 callbackContext; callbackContext.callback = nullCallback; - callbackContext.ctx.measureTimings = MeasureTiming::NO; + callbackContext.ctx.measureTimings = V1_2::MeasureTiming::NO; auto memPools = std::make_shared>(); return ExecuteGraph(memPools, inputTensors, @@ -507,11 +524,11 @@ bool ArmnnPreparedModel_1_2::ExecuteWithDummyInputs() template Return ArmnnPreparedModel_1_2::Execute(const V1_0::Request& request, - MeasureTiming measureTiming, + V1_2::MeasureTiming measureTiming, CallbackAsync_1_2 callback) { ExecutionContext_1_2 ctx; - if (measureTiming == MeasureTiming::YES) + if (measureTiming == V1_2::MeasureTiming::YES) { ctx.measureTimings = measureTiming; ctx.driverStart = Now(); -- cgit v1.2.1