diff --git a/neuralnetworks/1.0/utils/include/nnapi/hal/1.0/PreparedModel.h b/neuralnetworks/1.0/utils/include/nnapi/hal/1.0/PreparedModel.h index 31f366dadc..198cbc8e81 100644 --- a/neuralnetworks/1.0/utils/include/nnapi/hal/1.0/PreparedModel.h +++ b/neuralnetworks/1.0/utils/include/nnapi/hal/1.0/PreparedModel.h @@ -44,13 +44,13 @@ class PreparedModel final : public nn::IPreparedModel { nn::ExecutionResult, nn::Timing>> execute( const nn::Request& request, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration) const override; + const nn::OptionalDuration& loopTimeoutDuration) const override; nn::GeneralResult> executeFenced( const nn::Request& request, const std::vector& waitFor, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration, - const nn::OptionalTimeoutDuration& timeoutDurationAfterFence) const override; + const nn::OptionalDuration& loopTimeoutDuration, + const nn::OptionalDuration& timeoutDurationAfterFence) const override; std::any getUnderlyingResource() const override; diff --git a/neuralnetworks/1.0/utils/src/PreparedModel.cpp b/neuralnetworks/1.0/utils/src/PreparedModel.cpp index 46dd3f8254..add827567e 100644 --- a/neuralnetworks/1.0/utils/src/PreparedModel.cpp +++ b/neuralnetworks/1.0/utils/src/PreparedModel.cpp @@ -55,7 +55,7 @@ PreparedModel::PreparedModel(PrivateConstructorTag /*tag*/, sp, nn::Timing>> PreparedModel::execute( const nn::Request& request, nn::MeasureTiming /*measure*/, const nn::OptionalTimePoint& /*deadline*/, - const nn::OptionalTimeoutDuration& /*loopTimeoutDuration*/) const { + const nn::OptionalDuration& /*loopTimeoutDuration*/) const { // Ensure that request is ready for IPC. std::optional maybeRequestInShared; const nn::Request& requestInShared = NN_TRY(hal::utils::makeExecutionFailure( @@ -81,11 +81,12 @@ nn::ExecutionResult, nn::Timing>> Prepare } nn::GeneralResult> -PreparedModel::executeFenced( - const nn::Request& /*request*/, const std::vector& /*waitFor*/, - nn::MeasureTiming /*measure*/, const nn::OptionalTimePoint& /*deadline*/, - const nn::OptionalTimeoutDuration& /*loopTimeoutDuration*/, - const nn::OptionalTimeoutDuration& /*timeoutDurationAfterFence*/) const { +PreparedModel::executeFenced(const nn::Request& /*request*/, + const std::vector& /*waitFor*/, + nn::MeasureTiming /*measure*/, + const nn::OptionalTimePoint& /*deadline*/, + const nn::OptionalDuration& /*loopTimeoutDuration*/, + const nn::OptionalDuration& /*timeoutDurationAfterFence*/) const { return NN_ERROR(nn::ErrorStatus::GENERAL_FAILURE) << "IPreparedModel::executeFenced is not supported on 1.0 HAL service"; } diff --git a/neuralnetworks/1.2/utils/include/nnapi/hal/1.2/PreparedModel.h b/neuralnetworks/1.2/utils/include/nnapi/hal/1.2/PreparedModel.h index 65e1e8aa3f..53bd4d12ef 100644 --- a/neuralnetworks/1.2/utils/include/nnapi/hal/1.2/PreparedModel.h +++ b/neuralnetworks/1.2/utils/include/nnapi/hal/1.2/PreparedModel.h @@ -45,13 +45,13 @@ class PreparedModel final : public nn::IPreparedModel { nn::ExecutionResult, nn::Timing>> execute( const nn::Request& request, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration) const override; + const nn::OptionalDuration& loopTimeoutDuration) const override; nn::GeneralResult> executeFenced( const nn::Request& request, const std::vector& waitFor, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration, - const nn::OptionalTimeoutDuration& timeoutDurationAfterFence) const override; + const nn::OptionalDuration& loopTimeoutDuration, + const nn::OptionalDuration& timeoutDurationAfterFence) const override; std::any getUnderlyingResource() const override; diff --git a/neuralnetworks/1.2/utils/src/Conversions.cpp b/neuralnetworks/1.2/utils/src/Conversions.cpp index f11474fd60..3790d1f61e 100644 --- a/neuralnetworks/1.2/utils/src/Conversions.cpp +++ b/neuralnetworks/1.2/utils/src/Conversions.cpp @@ -43,7 +43,9 @@ constexpr std::underlying_type_t underlyingType(Type value) { return static_cast>(value); } +using HalDuration = std::chrono::duration; constexpr auto kVersion = android::nn::Version::ANDROID_Q; +constexpr uint64_t kNoTiming = std::numeric_limits::max(); } // namespace @@ -270,7 +272,18 @@ GeneralResult unvalidatedConvert(const hal::V1_2::MeasureTiming& } GeneralResult unvalidatedConvert(const hal::V1_2::Timing& timing) { - return Timing{.timeOnDevice = timing.timeOnDevice, .timeInDriver = timing.timeInDriver}; + constexpr uint64_t kMaxTiming = std::chrono::floor(Duration::max()).count(); + constexpr auto convertTiming = [](uint64_t halTiming) -> OptionalDuration { + if (halTiming == kNoTiming) { + return {}; + } + if (halTiming > kMaxTiming) { + return Duration::max(); + } + return HalDuration{halTiming}; + }; + return Timing{.timeOnDevice = convertTiming(timing.timeOnDevice), + .timeInDriver = convertTiming(timing.timeInDriver)}; } GeneralResult unvalidatedConvert(const hal::V1_2::Extension& extension) { @@ -547,7 +560,14 @@ nn::GeneralResult unvalidatedConvert(const nn::MeasureTiming& mea } nn::GeneralResult unvalidatedConvert(const nn::Timing& timing) { - return Timing{.timeOnDevice = timing.timeOnDevice, .timeInDriver = timing.timeInDriver}; + constexpr auto convertTiming = [](nn::OptionalDuration canonicalTiming) -> uint64_t { + if (!canonicalTiming.has_value()) { + return kNoTiming; + } + return std::chrono::ceil(*canonicalTiming).count(); + }; + return Timing{.timeOnDevice = convertTiming(timing.timeOnDevice), + .timeInDriver = convertTiming(timing.timeInDriver)}; } nn::GeneralResult unvalidatedConvert(const nn::Extension& extension) { diff --git a/neuralnetworks/1.2/utils/src/PreparedModel.cpp b/neuralnetworks/1.2/utils/src/PreparedModel.cpp index dad9a7e74b..32c2651950 100644 --- a/neuralnetworks/1.2/utils/src/PreparedModel.cpp +++ b/neuralnetworks/1.2/utils/src/PreparedModel.cpp @@ -106,7 +106,7 @@ PreparedModel::executeAsynchronously(const V1_0::Request& request, MeasureTiming nn::ExecutionResult, nn::Timing>> PreparedModel::execute( const nn::Request& request, nn::MeasureTiming measure, const nn::OptionalTimePoint& /*deadline*/, - const nn::OptionalTimeoutDuration& /*loopTimeoutDuration*/) const { + const nn::OptionalDuration& /*loopTimeoutDuration*/) const { // Ensure that request is ready for IPC. std::optional maybeRequestInShared; const nn::Request& requestInShared = NN_TRY(hal::utils::makeExecutionFailure( @@ -140,11 +140,12 @@ nn::ExecutionResult, nn::Timing>> Prepare } nn::GeneralResult> -PreparedModel::executeFenced( - const nn::Request& /*request*/, const std::vector& /*waitFor*/, - nn::MeasureTiming /*measure*/, const nn::OptionalTimePoint& /*deadline*/, - const nn::OptionalTimeoutDuration& /*loopTimeoutDuration*/, - const nn::OptionalTimeoutDuration& /*timeoutDurationAfterFence*/) const { +PreparedModel::executeFenced(const nn::Request& /*request*/, + const std::vector& /*waitFor*/, + nn::MeasureTiming /*measure*/, + const nn::OptionalTimePoint& /*deadline*/, + const nn::OptionalDuration& /*loopTimeoutDuration*/, + const nn::OptionalDuration& /*timeoutDurationAfterFence*/) const { return NN_ERROR(nn::ErrorStatus::GENERAL_FAILURE) << "IPreparedModel::executeFenced is not supported on 1.2 HAL service"; } diff --git a/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/Conversions.h b/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/Conversions.h index 9653a05da7..477bb7b6e0 100644 --- a/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/Conversions.h +++ b/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/Conversions.h @@ -44,7 +44,7 @@ GeneralResult unvalidatedConvert( const hal::V1_3::Request::MemoryPool& memoryPool); GeneralResult unvalidatedConvert( const hal::V1_3::OptionalTimePoint& optionalTimePoint); -GeneralResult unvalidatedConvert( +GeneralResult unvalidatedConvert( const hal::V1_3::OptionalTimeoutDuration& optionalTimeoutDuration); GeneralResult unvalidatedConvert(const hal::V1_3::ErrorStatus& errorStatus); @@ -54,7 +54,7 @@ GeneralResult convert(const hal::V1_3::Model& model); GeneralResult convert(const hal::V1_3::BufferDesc& bufferDesc); GeneralResult convert(const hal::V1_3::Request& request); GeneralResult convert(const hal::V1_3::OptionalTimePoint& optionalTimePoint); -GeneralResult convert( +GeneralResult convert( const hal::V1_3::OptionalTimeoutDuration& optionalTimeoutDuration); GeneralResult convert(const hal::V1_3::ErrorStatus& errorStatus); @@ -86,7 +86,7 @@ nn::GeneralResult unvalidatedConvert( nn::GeneralResult unvalidatedConvert( const nn::OptionalTimePoint& optionalTimePoint); nn::GeneralResult unvalidatedConvert( - const nn::OptionalTimeoutDuration& optionalTimeoutDuration); + const nn::OptionalDuration& optionalTimeoutDuration); nn::GeneralResult unvalidatedConvert(const nn::ErrorStatus& errorStatus); nn::GeneralResult convert(const nn::Priority& priority); @@ -96,7 +96,7 @@ nn::GeneralResult convert(const nn::BufferDesc& bufferDesc); nn::GeneralResult convert(const nn::Request& request); nn::GeneralResult convert(const nn::OptionalTimePoint& optionalTimePoint); nn::GeneralResult convert( - const nn::OptionalTimeoutDuration& optionalTimeoutDuration); + const nn::OptionalDuration& optionalTimeoutDuration); nn::GeneralResult convert(const nn::ErrorStatus& errorStatus); nn::GeneralResult convert(const nn::SharedHandle& handle); diff --git a/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/PreparedModel.h b/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/PreparedModel.h index e0d69dd7c6..09360eceb8 100644 --- a/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/PreparedModel.h +++ b/neuralnetworks/1.3/utils/include/nnapi/hal/1.3/PreparedModel.h @@ -44,13 +44,13 @@ class PreparedModel final : public nn::IPreparedModel { nn::ExecutionResult, nn::Timing>> execute( const nn::Request& request, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration) const override; + const nn::OptionalDuration& loopTimeoutDuration) const override; nn::GeneralResult> executeFenced( const nn::Request& request, const std::vector& waitFor, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration, - const nn::OptionalTimeoutDuration& timeoutDurationAfterFence) const override; + const nn::OptionalDuration& loopTimeoutDuration, + const nn::OptionalDuration& timeoutDurationAfterFence) const override; std::any getUnderlyingResource() const override; diff --git a/neuralnetworks/1.3/utils/src/Conversions.cpp b/neuralnetworks/1.3/utils/src/Conversions.cpp index 949dd0d1ed..c89a69f28b 100644 --- a/neuralnetworks/1.3/utils/src/Conversions.cpp +++ b/neuralnetworks/1.3/utils/src/Conversions.cpp @@ -272,47 +272,26 @@ GeneralResult unvalidatedConvert( GeneralResult unvalidatedConvert( const hal::V1_3::OptionalTimePoint& optionalTimePoint) { - constexpr auto kTimePointMaxCount = TimePoint::max().time_since_epoch().count(); - const auto makeTimePoint = [](uint64_t count) -> GeneralResult { - if (count > kTimePointMaxCount) { - return NN_ERROR(nn::ErrorStatus::GENERAL_FAILURE) - << "Unable to unvalidatedConvert OptionalTimePoint because the count exceeds " - "the max"; - } - const auto nanoseconds = std::chrono::nanoseconds{count}; - return TimePoint{nanoseconds}; - }; - using Discriminator = hal::V1_3::OptionalTimePoint::hidl_discriminator; switch (optionalTimePoint.getDiscriminator()) { case Discriminator::none: - return std::nullopt; + return {}; case Discriminator::nanosecondsSinceEpoch: - return makeTimePoint(optionalTimePoint.nanosecondsSinceEpoch()); + return TimePoint{Duration{optionalTimePoint.nanosecondsSinceEpoch()}}; } return NN_ERROR(nn::ErrorStatus::GENERAL_FAILURE) << "Invalid OptionalTimePoint discriminator " << underlyingType(optionalTimePoint.getDiscriminator()); } -GeneralResult unvalidatedConvert( +GeneralResult unvalidatedConvert( const hal::V1_3::OptionalTimeoutDuration& optionalTimeoutDuration) { - constexpr auto kTimeoutDurationMaxCount = TimeoutDuration::max().count(); - const auto makeTimeoutDuration = [](uint64_t count) -> GeneralResult { - if (count > kTimeoutDurationMaxCount) { - return NN_ERROR(nn::ErrorStatus::GENERAL_FAILURE) - << "Unable to unvalidatedConvert OptionalTimeoutDuration because the count " - "exceeds the max"; - } - return TimeoutDuration{count}; - }; - using Discriminator = hal::V1_3::OptionalTimeoutDuration::hidl_discriminator; switch (optionalTimeoutDuration.getDiscriminator()) { case Discriminator::none: - return std::nullopt; + return {}; case Discriminator::nanoseconds: - return makeTimeoutDuration(optionalTimeoutDuration.nanoseconds()); + return Duration(optionalTimeoutDuration.nanoseconds()); } return NN_ERROR(nn::ErrorStatus::GENERAL_FAILURE) << "Invalid OptionalTimeoutDuration discriminator " @@ -360,7 +339,7 @@ GeneralResult convert(const hal::V1_3::OptionalTimePoint& opt return validatedConvert(optionalTimePoint); } -GeneralResult convert( +GeneralResult convert( const hal::V1_3::OptionalTimeoutDuration& optionalTimeoutDuration) { return validatedConvert(optionalTimeoutDuration); } @@ -629,27 +608,16 @@ nn::GeneralResult unvalidatedConvert( OptionalTimePoint ret; if (optionalTimePoint.has_value()) { const auto count = optionalTimePoint.value().time_since_epoch().count(); - if (count < 0) { - return NN_ERROR(nn::ErrorStatus::GENERAL_FAILURE) - << "Unable to unvalidatedConvert OptionalTimePoint because time since epoch " - "count is " - "negative"; - } ret.nanosecondsSinceEpoch(count); } return ret; } nn::GeneralResult unvalidatedConvert( - const nn::OptionalTimeoutDuration& optionalTimeoutDuration) { + const nn::OptionalDuration& optionalTimeoutDuration) { OptionalTimeoutDuration ret; if (optionalTimeoutDuration.has_value()) { const auto count = optionalTimeoutDuration.value().count(); - if (count < 0) { - return NN_ERROR(nn::ErrorStatus::GENERAL_FAILURE) - << "Unable to unvalidatedConvert OptionalTimeoutDuration because count is " - "negative"; - } ret.nanoseconds(count); } return ret; @@ -697,7 +665,7 @@ nn::GeneralResult convert(const nn::OptionalTimePoint& option } nn::GeneralResult convert( - const nn::OptionalTimeoutDuration& optionalTimeoutDuration) { + const nn::OptionalDuration& optionalTimeoutDuration) { return validatedConvert(optionalTimeoutDuration); } diff --git a/neuralnetworks/1.3/utils/src/PreparedModel.cpp b/neuralnetworks/1.3/utils/src/PreparedModel.cpp index 49b9b0bcc3..124a8db263 100644 --- a/neuralnetworks/1.3/utils/src/PreparedModel.cpp +++ b/neuralnetworks/1.3/utils/src/PreparedModel.cpp @@ -159,7 +159,7 @@ PreparedModel::executeAsynchronously(const Request& request, V1_2::MeasureTiming nn::ExecutionResult, nn::Timing>> PreparedModel::execute( const nn::Request& request, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration) const { + const nn::OptionalDuration& loopTimeoutDuration) const { // Ensure that request is ready for IPC. std::optional maybeRequestInShared; const nn::Request& requestInShared = NN_TRY(hal::utils::makeExecutionFailure( @@ -200,8 +200,8 @@ nn::ExecutionResult, nn::Timing>> Prepare nn::GeneralResult> PreparedModel::executeFenced(const nn::Request& request, const std::vector& waitFor, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration, - const nn::OptionalTimeoutDuration& timeoutDurationAfterFence) const { + const nn::OptionalDuration& loopTimeoutDuration, + const nn::OptionalDuration& timeoutDurationAfterFence) const { // Ensure that request is ready for IPC. std::optional maybeRequestInShared; const nn::Request& requestInShared = diff --git a/neuralnetworks/utils/common/include/nnapi/hal/InvalidPreparedModel.h b/neuralnetworks/utils/common/include/nnapi/hal/InvalidPreparedModel.h index 4b32b4e3af..985cddb2c2 100644 --- a/neuralnetworks/utils/common/include/nnapi/hal/InvalidPreparedModel.h +++ b/neuralnetworks/utils/common/include/nnapi/hal/InvalidPreparedModel.h @@ -32,13 +32,13 @@ class InvalidPreparedModel final : public nn::IPreparedModel { nn::ExecutionResult, nn::Timing>> execute( const nn::Request& request, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration) const override; + const nn::OptionalDuration& loopTimeoutDuration) const override; nn::GeneralResult> executeFenced( const nn::Request& request, const std::vector& waitFor, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration, - const nn::OptionalTimeoutDuration& timeoutDurationAfterFence) const override; + const nn::OptionalDuration& loopTimeoutDuration, + const nn::OptionalDuration& timeoutDurationAfterFence) const override; std::any getUnderlyingResource() const override; }; diff --git a/neuralnetworks/utils/common/include/nnapi/hal/ResilientPreparedModel.h b/neuralnetworks/utils/common/include/nnapi/hal/ResilientPreparedModel.h index c2940d16bc..d86c88be32 100644 --- a/neuralnetworks/utils/common/include/nnapi/hal/ResilientPreparedModel.h +++ b/neuralnetworks/utils/common/include/nnapi/hal/ResilientPreparedModel.h @@ -49,13 +49,13 @@ class ResilientPreparedModel final : public nn::IPreparedModel { nn::ExecutionResult, nn::Timing>> execute( const nn::Request& request, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration) const override; + const nn::OptionalDuration& loopTimeoutDuration) const override; nn::GeneralResult> executeFenced( const nn::Request& request, const std::vector& waitFor, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration, - const nn::OptionalTimeoutDuration& timeoutDurationAfterFence) const override; + const nn::OptionalDuration& loopTimeoutDuration, + const nn::OptionalDuration& timeoutDurationAfterFence) const override; std::any getUnderlyingResource() const override; diff --git a/neuralnetworks/utils/common/src/InvalidPreparedModel.cpp b/neuralnetworks/utils/common/src/InvalidPreparedModel.cpp index 9ae7a63949..a46f4ac574 100644 --- a/neuralnetworks/utils/common/src/InvalidPreparedModel.cpp +++ b/neuralnetworks/utils/common/src/InvalidPreparedModel.cpp @@ -29,7 +29,7 @@ namespace android::hardware::neuralnetworks::utils { nn::ExecutionResult, nn::Timing>> InvalidPreparedModel::execute(const nn::Request& /*request*/, nn::MeasureTiming /*measure*/, const nn::OptionalTimePoint& /*deadline*/, - const nn::OptionalTimeoutDuration& /*loopTimeoutDuration*/) const { + const nn::OptionalDuration& /*loopTimeoutDuration*/) const { return NN_ERROR() << "InvalidPreparedModel"; } @@ -37,8 +37,8 @@ nn::GeneralResult> InvalidPreparedModel::executeFenced( const nn::Request& /*request*/, const std::vector& /*waitFor*/, nn::MeasureTiming /*measure*/, const nn::OptionalTimePoint& /*deadline*/, - const nn::OptionalTimeoutDuration& /*loopTimeoutDuration*/, - const nn::OptionalTimeoutDuration& /*timeoutDurationAfterFence*/) const { + const nn::OptionalDuration& /*loopTimeoutDuration*/, + const nn::OptionalDuration& /*timeoutDurationAfterFence*/) const { return NN_ERROR() << "InvalidPreparedModel"; } diff --git a/neuralnetworks/utils/common/src/ResilientPreparedModel.cpp b/neuralnetworks/utils/common/src/ResilientPreparedModel.cpp index 1c9ecba4f6..012a1dedc3 100644 --- a/neuralnetworks/utils/common/src/ResilientPreparedModel.cpp +++ b/neuralnetworks/utils/common/src/ResilientPreparedModel.cpp @@ -64,16 +64,17 @@ nn::SharedPreparedModel ResilientPreparedModel::recover( nn::ExecutionResult, nn::Timing>> ResilientPreparedModel::execute(const nn::Request& request, nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration) const { + const nn::OptionalDuration& loopTimeoutDuration) const { return getPreparedModel()->execute(request, measure, deadline, loopTimeoutDuration); } nn::GeneralResult> -ResilientPreparedModel::executeFenced( - const nn::Request& request, const std::vector& waitFor, - nn::MeasureTiming measure, const nn::OptionalTimePoint& deadline, - const nn::OptionalTimeoutDuration& loopTimeoutDuration, - const nn::OptionalTimeoutDuration& timeoutDurationAfterFence) const { +ResilientPreparedModel::executeFenced(const nn::Request& request, + const std::vector& waitFor, + nn::MeasureTiming measure, + const nn::OptionalTimePoint& deadline, + const nn::OptionalDuration& loopTimeoutDuration, + const nn::OptionalDuration& timeoutDurationAfterFence) const { return getPreparedModel()->executeFenced(request, waitFor, measure, deadline, loopTimeoutDuration, timeoutDurationAfterFence); }