Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7f5c7d29 authored by Xusong Wang's avatar Xusong Wang
Browse files

Reusable execution at HAL level -- HAL.

This CL modifies the canonical/AIDL adapter to use IExecution object
if available.

Bug: 202405342
Bug: 202431255
Test: NNT_static
Test: CtsNNAPITestCases
Test: VtsHalNeuralnetworksTargetTest
Change-Id: I6aac3c57f97ac87a5ba3f78cfd843fcc403decff
parent 0d9b1a9d
Loading
Loading
Loading
Loading
+26 −11
Original line number Diff line number Diff line
@@ -26,7 +26,14 @@ package {
cc_defaults {
    name: "neuralnetworks_utils_hal_aidl_defaults",
    defaults: ["neuralnetworks_utils_defaults"],
    srcs: ["src/*"],
    srcs: [
        // AIDL utils that a driver may depend on.
        "src/BufferTracker.cpp",
        "src/Conversions.cpp",
        "src/HalUtils.cpp",
        "src/Utils.cpp",
        "src/ValidateHal.cpp",
    ],
    local_include_dirs: ["include/nnapi/hal/aidl/"],
    export_include_dirs: ["include"],
    cflags: ["-Wthread-safety"],
@@ -47,6 +54,7 @@ cc_defaults {
    },
}

// Deprecated. Remove once all modules depending on this are migrated away.
cc_library_static {
    name: "neuralnetworks_utils_hal_aidl_v1",
    defaults: ["neuralnetworks_utils_hal_aidl_defaults"],
@@ -55,20 +63,26 @@ cc_library_static {
    ],
}

cc_library_static {
    name: "neuralnetworks_utils_hal_aidl_v2",
    defaults: ["neuralnetworks_utils_hal_aidl_defaults"],
    shared_libs: [
        "android.hardware.neuralnetworks-V2-ndk",
    ],
}

cc_library_static {
    name: "neuralnetworks_utils_hal_aidl",
    defaults: ["neuralnetworks_utils_hal_aidl_defaults"],
    srcs: [
        // Additional AIDL utils for the runtime.
        "src/Assertions.cpp",
        "src/Buffer.cpp",
        "src/Burst.cpp",
        "src/Callbacks.cpp",
        "src/Device.cpp",
        "src/Execution.cpp",
        "src/InvalidDevice.cpp",
        "src/PreparedModel.cpp",
        "src/ProtectCallback.cpp",
        "src/Service.cpp",
    ],
    shared_libs: [
        "android.hardware.neuralnetworks-V3-ndk",
        "android.hardware.neuralnetworks-V4-ndk",
    ],
    cflags: ["-DNN_AIDL_V4_OR_ABOVE"],
}

// A cc_defaults that includes the latest non-experimental AIDL utilities and other AIDL libraries
@@ -79,9 +93,10 @@ cc_defaults {
    static_libs: [
        "android.hardware.common-V2-ndk",
        "android.hardware.graphics.common-V3-ndk",
        "android.hardware.neuralnetworks-V3-ndk",
        "android.hardware.neuralnetworks-V4-ndk",
        "neuralnetworks_utils_hal_aidl",
    ],
    cflags: ["-DNN_AIDL_V4_OR_ABOVE"],
}

cc_test {
+3 −0
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ class PreparedModelCallback final : public BnPreparedModelCallback, public IProt
  public:
    using Data = nn::GeneralResult<nn::SharedPreparedModel>;

    PreparedModelCallback(nn::Version featureLevel) : kFeatureLevel(featureLevel) {}

    ndk::ScopedAStatus notify(ErrorStatus status,
                              const std::shared_ptr<IPreparedModel>& preparedModel) override;

@@ -44,6 +46,7 @@ class PreparedModelCallback final : public BnPreparedModelCallback, public IProt
    Data get();

  private:
    const nn::Version kFeatureLevel;
    hal::utils::TransferValue<Data> mData;
};

+36 −5
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
#ifndef ANDROID_HARDWARE_INTERFACES_NEURALNETWORKS_AIDL_UTILS_EXECUTION_H
#define ANDROID_HARDWARE_INTERFACES_NEURALNETWORKS_AIDL_UTILS_EXECUTION_H

#include <aidl/android/hardware/neuralnetworks/IExecution.h>

#include <nnapi/IExecution.h>
#include <nnapi/Result.h>
#include <nnapi/Types.h>
@@ -33,16 +35,21 @@

namespace aidl::android::hardware::neuralnetworks::utils {

class Execution final : public nn::IExecution, public std::enable_shared_from_this<Execution> {
// A reusable execution implementation with a cached Request, internally it is still passing the
// request to the driver in every computation.
class ExecutionWithCachedRequest final
    : public nn::IExecution,
      public std::enable_shared_from_this<ExecutionWithCachedRequest> {
    struct PrivateConstructorTag {};

  public:
    static nn::GeneralResult<std::shared_ptr<const Execution>> create(
    static nn::GeneralResult<std::shared_ptr<const ExecutionWithCachedRequest>> create(
            std::shared_ptr<const PreparedModel> preparedModel, Request request,
            hal::utils::RequestRelocation relocation, bool measure, int64_t loopTimeoutDuration);

    Execution(PrivateConstructorTag tag, std::shared_ptr<const PreparedModel> preparedModel,
              Request request, hal::utils::RequestRelocation relocation, bool measure,
    ExecutionWithCachedRequest(PrivateConstructorTag tag,
                               std::shared_ptr<const PreparedModel> preparedModel, Request request,
                               hal::utils::RequestRelocation relocation, bool measure,
                               int64_t loopTimeoutDuration);

    nn::ExecutionResult<std::pair<std::vector<nn::OutputShape>, nn::Timing>> compute(
@@ -60,6 +67,30 @@ class Execution final : public nn::IExecution, public std::enable_shared_from_th
    const int64_t kLoopTimeoutDuration;
};

// A reusable execution implementation that is backed by an actual AIDL IExecution object.
class Execution final : public nn::IExecution, public std::enable_shared_from_this<Execution> {
    struct PrivateConstructorTag {};

  public:
    static nn::GeneralResult<std::shared_ptr<const Execution>> create(
            std::shared_ptr<aidl_hal::IExecution> execution,
            hal::utils::RequestRelocation relocation);

    Execution(PrivateConstructorTag tag, std::shared_ptr<aidl_hal::IExecution> execution,
              hal::utils::RequestRelocation relocation);

    nn::ExecutionResult<std::pair<std::vector<nn::OutputShape>, nn::Timing>> compute(
            const nn::OptionalTimePoint& deadline) const override;

    nn::GeneralResult<std::pair<nn::SyncFence, nn::ExecuteFencedInfoCallback>> computeFenced(
            const std::vector<nn::SyncFence>& waitFor, const nn::OptionalTimePoint& deadline,
            const nn::OptionalDuration& timeoutDurationAfterFence) const override;

  private:
    const std::shared_ptr<aidl_hal::IExecution> kExecution;
    const hal::utils::RequestRelocation kRelocation;
};

}  // namespace aidl::android::hardware::neuralnetworks::utils

#endif  // ANDROID_HARDWARE_INTERFACES_NEURALNETWORKS_AIDL_UTILS_EXECUTION_H
+5 −0
Original line number Diff line number Diff line
@@ -61,6 +61,11 @@
#include <aidl/android/hardware/neuralnetworks/SymmPerChannelQuantParams.h>
#include <aidl/android/hardware/neuralnetworks/Timing.h>

#ifdef NN_AIDL_V4_OR_ABOVE
#include <aidl/android/hardware/neuralnetworks/BnExecution.h>
#include <aidl/android/hardware/neuralnetworks/IExecution.h>
#endif  // NN_AIDL_V4_OR_ABOVE

namespace android::nn {

namespace aidl_hal = ::aidl::android::hardware::neuralnetworks;
+4 −2
Original line number Diff line number Diff line
@@ -41,10 +41,11 @@ class PreparedModel final : public nn::IPreparedModel,

  public:
    static nn::GeneralResult<std::shared_ptr<const PreparedModel>> create(
            std::shared_ptr<aidl_hal::IPreparedModel> preparedModel);
            std::shared_ptr<aidl_hal::IPreparedModel> preparedModel, nn::Version featureLevel);

    PreparedModel(PrivateConstructorTag tag,
                  std::shared_ptr<aidl_hal::IPreparedModel> preparedModel);
                  std::shared_ptr<aidl_hal::IPreparedModel> preparedModel,
                  nn::Version featureLevel);

    nn::ExecutionResult<std::pair<std::vector<nn::OutputShape>, nn::Timing>> execute(
            const nn::Request& request, nn::MeasureTiming measure,
@@ -78,6 +79,7 @@ class PreparedModel final : public nn::IPreparedModel,

  private:
    const std::shared_ptr<aidl_hal::IPreparedModel> kPreparedModel;
    const nn::Version kFeatureLevel;
};

}  // namespace aidl::android::hardware::neuralnetworks::utils
Loading