summaryrefslogtreecommitdiff
path: root/nn/driver
diff options
context:
space:
mode:
authorXusong Wang <xusongw@google.com>2020-01-08 16:52:37 -0800
committerXusong Wang <xusongw@google.com>2020-01-21 10:30:21 -0800
commitafe87346b2f896bab1a9518dd6c0d9e299cdf144 (patch)
treec25ce12378dcfcf9fd4b0482805e696faf99de3c /nn/driver
parent6a42a585c2ebd5e7b713d7b14762ea48737bd511 (diff)
downloadml-afe87346b2f896bab1a9518dd6c0d9e299cdf144.tar.gz
Memory Domain Runtime: HAL APIs.
Modify NNAPI runtime in accordance with the HAL API changes: - Upgrade Request to V1_3. - Add compliance, conversion, and validation utilities. - Add compliance test. - Add dummy allocate method to SampleDriver. Bug: 141353602 Bug: 141363565 Test: m Test: NNT_static Change-Id: I863c674f960d465168cb10cef19ee1c3c6e46e92 Merged-In: I863c674f960d465168cb10cef19ee1c3c6e46e92 (cherry picked from commit 7ac6c9ddd24c3db5f82aead49e0d98eedd403c39)
Diffstat (limited to 'nn/driver')
-rw-r--r--nn/driver/sample/SampleDriver.cpp49
-rw-r--r--nn/driver/sample/SampleDriver.h16
2 files changed, 44 insertions, 21 deletions
diff --git a/nn/driver/sample/SampleDriver.cpp b/nn/driver/sample/SampleDriver.cpp
index 0e1295d5f..443dfa98a 100644
--- a/nn/driver/sample/SampleDriver.cpp
+++ b/nn/driver/sample/SampleDriver.cpp
@@ -205,6 +205,17 @@ Return<DeviceStatus> SampleDriver::getStatus() {
return DeviceStatus::AVAILABLE;
}
+Return<void> SampleDriver::allocate(const V1_3::BufferDesc& /*desc*/,
+ const hidl_vec<sp<V1_3::IPreparedModel>>& /*preparedModels*/,
+ const hidl_vec<V1_3::BufferRole>& /*inputRoles*/,
+ const hidl_vec<V1_3::BufferRole>& /*outputRoles*/,
+ allocate_cb cb) {
+ VLOG(DRIVER) << "SampleDriver::allocate";
+ // TODO(xusongw): Implement memory domain in sample driver.
+ cb(ErrorStatus::GENERAL_FAILURE, nullptr, 0);
+ return Void();
+}
+
int SampleDriver::run() {
android::hardware::configureRpcThreadpool(4, true);
if (registerAsService(mName) != android::OK) {
@@ -228,7 +239,7 @@ void asyncExecute(const Request& request, MeasureTiming measure, time_point driv
NNTRACE_FULL(NNTRACE_LAYER_DRIVER, NNTRACE_PHASE_INPUTS_AND_OUTPUTS,
"SampleDriver::asyncExecute");
std::vector<RunTimePoolInfo> requestPoolInfos;
- if (!setRunTimePoolInfosFromHidlMemories(&requestPoolInfos, request.pools)) {
+ if (!setRunTimePoolInfosFromMemoryPools(&requestPoolInfos, request.pools)) {
notify(callback, ErrorStatus::GENERAL_FAILURE, {}, kNoTiming);
return;
}
@@ -283,17 +294,20 @@ Return<ErrorStatus> executeBase(const Request& request, MeasureTiming measure, c
return ErrorStatus::NONE;
}
-Return<ErrorStatus> SamplePreparedModel::execute(const Request& request,
+Return<ErrorStatus> SamplePreparedModel::execute(const V1_0::Request& request,
const sp<V1_0::IExecutionCallback>& callback) {
- return executeBase(request, MeasureTiming::NO, mModel, *mDriver, mPoolInfos, callback);
+ return executeBase(convertToV1_3(request), MeasureTiming::NO, mModel, *mDriver, mPoolInfos,
+ callback);
}
-Return<ErrorStatus> SamplePreparedModel::execute_1_2(const Request& request, MeasureTiming measure,
+Return<ErrorStatus> SamplePreparedModel::execute_1_2(const V1_0::Request& request,
+ MeasureTiming measure,
const sp<V1_2::IExecutionCallback>& callback) {
- return executeBase(request, measure, mModel, *mDriver, mPoolInfos, callback);
+ return executeBase(convertToV1_3(request), measure, mModel, *mDriver, mPoolInfos, callback);
}
-Return<ErrorStatus> SamplePreparedModel::execute_1_3(const Request& request, MeasureTiming measure,
+Return<ErrorStatus> SamplePreparedModel::execute_1_3(const V1_3::Request& request,
+ MeasureTiming measure,
const sp<V1_2::IExecutionCallback>& callback) {
return executeBase(request, measure, mModel, *mDriver, mPoolInfos, callback);
}
@@ -315,7 +329,7 @@ static std::tuple<ErrorStatus, hidl_vec<OutputShape>, Timing> executeSynchronous
NNTRACE_FULL_SWITCH(NNTRACE_LAYER_DRIVER, NNTRACE_PHASE_INPUTS_AND_OUTPUTS,
"SampleDriver::executeSynchronouslyBase");
std::vector<RunTimePoolInfo> requestPoolInfos;
- if (!setRunTimePoolInfosFromHidlMemories(&requestPoolInfos, request.pools)) {
+ if (!setRunTimePoolInfosFromMemoryPools(&requestPoolInfos, request.pools)) {
return {ErrorStatus::GENERAL_FAILURE, {}, kNoTiming};
}
@@ -338,16 +352,16 @@ static std::tuple<ErrorStatus, hidl_vec<OutputShape>, Timing> executeSynchronous
return {executionStatus, std::move(outputShapes), kNoTiming};
}
-Return<void> SamplePreparedModel::executeSynchronously(const Request& request,
+Return<void> SamplePreparedModel::executeSynchronously(const V1_0::Request& request,
MeasureTiming measure,
executeSynchronously_cb cb) {
auto [status, outputShapes, timing] =
- executeSynchronouslyBase(request, measure, mModel, *mDriver, mPoolInfos);
+ executeSynchronouslyBase(convertToV1_3(request), measure, mModel, *mDriver, mPoolInfos);
cb(status, std::move(outputShapes), timing);
return Void();
}
-Return<void> SamplePreparedModel::executeSynchronously_1_3(const Request& request,
+Return<void> SamplePreparedModel::executeSynchronously_1_3(const V1_3::Request& request,
MeasureTiming measure,
executeSynchronously_1_3_cb cb) {
auto [status, outputShapes, timing] =
@@ -379,7 +393,7 @@ class BurstExecutorWithCache : public ExecutionBurstServer::IBurstExecutorWithCa
void removeCacheEntry(int32_t slot) override { mMemoryCache.erase(slot); }
std::tuple<ErrorStatus, hidl_vec<OutputShape>, Timing> execute(
- const Request& request, const std::vector<int32_t>& slots,
+ const V1_0::Request& request, const std::vector<int32_t>& slots,
MeasureTiming measure) override {
NNTRACE_FULL(NNTRACE_LAYER_DRIVER, NNTRACE_PHASE_EXECUTION,
"BurstExecutorWithCache::execute");
@@ -394,10 +408,13 @@ class BurstExecutorWithCache : public ExecutionBurstServer::IBurstExecutorWithCa
}
// finish the request object (for validation)
- hidl_vec<hidl_memory> pools(slots.size());
- std::transform(slots.begin(), slots.end(), pools.begin(),
- [this](int32_t slot) { return mMemoryCache[slot]->getHidlMemory(); });
- Request fullRequest = request;
+ hidl_vec<Request::MemoryPool> pools(slots.size());
+ std::transform(slots.begin(), slots.end(), pools.begin(), [this](int32_t slot) {
+ Request::MemoryPool pool;
+ pool.hidlMemory(mMemoryCache[slot]->getHidlMemory());
+ return pool;
+ });
+ Request fullRequest = {.inputs = request.inputs, .outputs = request.outputs};
fullRequest.pools = std::move(pools);
// validate request object against the model
@@ -414,7 +431,7 @@ class BurstExecutorWithCache : public ExecutionBurstServer::IBurstExecutorWithCa
// execution
CpuExecutor executor = mDriver->getExecutor();
if (measure == MeasureTiming::YES) deviceStart = now();
- int n = executor.run(mModel, request, mModelPoolInfos, requestPoolInfos);
+ int n = executor.run(mModel, fullRequest, mModelPoolInfos, requestPoolInfos);
if (measure == MeasureTiming::YES) deviceEnd = now();
VLOG(DRIVER) << "executor.run returned " << n;
ErrorStatus executionStatus = convertResultCodeToErrorStatus(n);
diff --git a/nn/driver/sample/SampleDriver.h b/nn/driver/sample/SampleDriver.h
index 0a3ff08a3..9f0a7d438 100644
--- a/nn/driver/sample/SampleDriver.h
+++ b/nn/driver/sample/SampleDriver.h
@@ -81,6 +81,11 @@ class SampleDriver : public hal::IDevice {
const hal::hidl_vec<hal::hidl_handle>& dataCache, const hal::CacheToken& token,
const sp<hal::V1_3::IPreparedModelCallback>& callback) override;
hal::Return<hal::DeviceStatus> getStatus() override;
+ hal::Return<void> allocate(const hal::V1_3::BufferDesc& desc,
+ const hal::hidl_vec<sp<hal::V1_3::IPreparedModel>>& preparedModels,
+ const hal::hidl_vec<hal::V1_3::BufferRole>& inputRoles,
+ const hal::hidl_vec<hal::V1_3::BufferRole>& outputRoles,
+ allocate_cb cb) override;
// Starts and runs the driver service. Typically called from main().
// This will return only once the service shuts down.
@@ -101,17 +106,18 @@ class SamplePreparedModel : public hal::IPreparedModel {
~SamplePreparedModel() override {}
bool initialize();
hal::Return<hal::ErrorStatus> execute(
- const hal::Request& request,
+ const hal::V1_0::Request& request,
const sp<hal::V1_0::IExecutionCallback>& callback) override;
hal::Return<hal::ErrorStatus> execute_1_2(
- const hal::Request& request, hal::MeasureTiming measure,
+ const hal::V1_0::Request& request, hal::MeasureTiming measure,
const sp<hal::V1_2::IExecutionCallback>& callback) override;
hal::Return<hal::ErrorStatus> execute_1_3(
- const hal::Request& request, hal::MeasureTiming measure,
+ const hal::V1_3::Request& request, hal::MeasureTiming measure,
const sp<hal::V1_2::IExecutionCallback>& callback) override;
- hal::Return<void> executeSynchronously(const hal::Request& request, hal::MeasureTiming measure,
+ hal::Return<void> executeSynchronously(const hal::V1_0::Request& request,
+ hal::MeasureTiming measure,
executeSynchronously_cb cb) override;
- hal::Return<void> executeSynchronously_1_3(const hal::Request& request,
+ hal::Return<void> executeSynchronously_1_3(const hal::V1_3::Request& request,
hal::MeasureTiming measure,
executeSynchronously_1_3_cb cb) override;
hal::Return<void> configureExecutionBurst(