From 8bfa243972d34c97111f0e7af6e77a0ab04d4f60 Mon Sep 17 00:00:00 2001 From: Xusong Wang Date: Fri, 7 May 2021 14:13:22 -0700 Subject: [PATCH] Use proper alignment and padding for pointer arguments -- HAL. This CL modifies the shared memory allocation for pointer arguments to use proper alignment and padding. We use default alignment (64) and min padding (1) for HIDL drivers, and default alignment (64) and default padding (64) for sAIDL drivers. Bug: 184164929 Test: NNT_static Change-Id: I22591640fa047d5f75d437edac1a7645d3b05526 --- neuralnetworks/1.0/utils/src/PreparedModel.cpp | 6 ++++-- .../1.2/utils/src/ExecutionBurstController.cpp | 6 ++++-- neuralnetworks/1.2/utils/src/PreparedModel.cpp | 6 ++++-- neuralnetworks/1.3/utils/src/PreparedModel.cpp | 9 ++++++--- neuralnetworks/aidl/utils/src/Burst.cpp | 6 ++++-- neuralnetworks/aidl/utils/src/PreparedModel.cpp | 9 ++++++--- .../utils/common/include/nnapi/hal/CommonUtils.h | 4 ++-- neuralnetworks/utils/common/src/CommonUtils.cpp | 8 ++++---- 8 files changed, 34 insertions(+), 20 deletions(-) diff --git a/neuralnetworks/1.0/utils/src/PreparedModel.cpp b/neuralnetworks/1.0/utils/src/PreparedModel.cpp index 7987ab4d7f..00970c090d 100644 --- a/neuralnetworks/1.0/utils/src/PreparedModel.cpp +++ b/neuralnetworks/1.0/utils/src/PreparedModel.cpp @@ -65,7 +65,8 @@ nn::ExecutionResult, nn::Timing>> Prepare hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::makeExecutionFailure(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation))); + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation))); const auto hidlRequest = NN_TRY(hal::utils::makeExecutionFailure(convert(requestInShared))); @@ -111,7 +112,8 @@ nn::GeneralResult PreparedModel::createReusableExecution( std::optional maybeRequestInShared; hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation)); + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation)); auto hidlRequest = NN_TRY(convert(requestInShared)); return Execution::create(shared_from_this(), std::move(hidlRequest), std::move(relocation)); diff --git a/neuralnetworks/1.2/utils/src/ExecutionBurstController.cpp b/neuralnetworks/1.2/utils/src/ExecutionBurstController.cpp index 8e82d2536d..b4b6f680d3 100644 --- a/neuralnetworks/1.2/utils/src/ExecutionBurstController.cpp +++ b/neuralnetworks/1.2/utils/src/ExecutionBurstController.cpp @@ -328,7 +328,8 @@ ExecutionBurstController::execute(const nn::Request& request, nn::MeasureTiming hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::makeExecutionFailure(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation))); + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation))); // clear pools field of request, as they will be provided via slots const auto requestWithoutPools = nn::Request{ @@ -373,7 +374,8 @@ nn::GeneralResult ExecutionBurstController::createReusableE std::optional maybeRequestInShared; hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation)); + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation)); // clear pools field of request, as they will be provided via slots const auto requestWithoutPools = nn::Request{ diff --git a/neuralnetworks/1.2/utils/src/PreparedModel.cpp b/neuralnetworks/1.2/utils/src/PreparedModel.cpp index 1d8793733b..d0ef36e7b5 100644 --- a/neuralnetworks/1.2/utils/src/PreparedModel.cpp +++ b/neuralnetworks/1.2/utils/src/PreparedModel.cpp @@ -97,7 +97,8 @@ nn::ExecutionResult, nn::Timing>> Prepare hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::makeExecutionFailure(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation))); + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation))); const auto hidlRequest = NN_TRY(hal::utils::makeExecutionFailure(convert(requestInShared))); const auto hidlMeasure = NN_TRY(hal::utils::makeExecutionFailure(convert(measure))); @@ -140,7 +141,8 @@ nn::GeneralResult PreparedModel::createReusableExecution( std::optional maybeRequestInShared; hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation)); + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation)); auto hidlRequest = NN_TRY(convert(requestInShared)); auto hidlMeasure = NN_TRY(convert(measure)); diff --git a/neuralnetworks/1.3/utils/src/PreparedModel.cpp b/neuralnetworks/1.3/utils/src/PreparedModel.cpp index cb56bdcb99..1623de5e9f 100644 --- a/neuralnetworks/1.3/utils/src/PreparedModel.cpp +++ b/neuralnetworks/1.3/utils/src/PreparedModel.cpp @@ -143,7 +143,8 @@ nn::ExecutionResult, nn::Timing>> Prepare hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::makeExecutionFailure(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation))); + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation))); const auto hidlRequest = NN_TRY(hal::utils::makeExecutionFailure(convert(requestInShared))); const auto hidlMeasure = NN_TRY(hal::utils::makeExecutionFailure(convert(measure))); @@ -184,7 +185,8 @@ PreparedModel::executeFenced(const nn::Request& request, const std::vector maybeRequestInShared; hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation)); + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation)); const auto hidlRequest = NN_TRY(convert(requestInShared)); const auto hidlWaitFor = NN_TRY(hal::utils::convertSyncFences(waitFor)); @@ -236,7 +238,8 @@ nn::GeneralResult PreparedModel::createReusableExecution( std::optional maybeRequestInShared; hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation)); + &request, nn::kDefaultRequestMemoryAlignment, nn::kMinMemoryPadding, + &maybeRequestInShared, &relocation)); auto hidlRequest = NN_TRY(convert(requestInShared)); auto hidlMeasure = NN_TRY(convert(measure)); diff --git a/neuralnetworks/aidl/utils/src/Burst.cpp b/neuralnetworks/aidl/utils/src/Burst.cpp index 3cbba4d643..87cd0e4afe 100644 --- a/neuralnetworks/aidl/utils/src/Burst.cpp +++ b/neuralnetworks/aidl/utils/src/Burst.cpp @@ -178,7 +178,8 @@ nn::ExecutionResult, nn::Timing>> Burst:: hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::makeExecutionFailure(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation))); + &request, nn::kDefaultRequestMemoryAlignment, nn::kDefaultRequestMemoryPadding, + &maybeRequestInShared, &relocation))); const auto aidlRequest = NN_TRY(hal::utils::makeExecutionFailure(convert(requestInShared))); const auto aidlMeasure = NN_TRY(hal::utils::makeExecutionFailure(convert(measure))); @@ -248,7 +249,8 @@ nn::GeneralResult Burst::createReusableExecution( std::optional maybeRequestInShared; hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation)); + &request, nn::kDefaultRequestMemoryAlignment, nn::kDefaultRequestMemoryPadding, + &maybeRequestInShared, &relocation)); auto aidlRequest = NN_TRY(convert(requestInShared)); const auto aidlMeasure = NN_TRY(convert(measure)); diff --git a/neuralnetworks/aidl/utils/src/PreparedModel.cpp b/neuralnetworks/aidl/utils/src/PreparedModel.cpp index 191560786f..18e7636346 100644 --- a/neuralnetworks/aidl/utils/src/PreparedModel.cpp +++ b/neuralnetworks/aidl/utils/src/PreparedModel.cpp @@ -80,7 +80,8 @@ nn::ExecutionResult, nn::Timing>> Prepare hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::makeExecutionFailure(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation))); + &request, nn::kDefaultRequestMemoryAlignment, nn::kDefaultRequestMemoryPadding, + &maybeRequestInShared, &relocation))); const auto aidlRequest = NN_TRY(hal::utils::makeExecutionFailure(convert(requestInShared))); const auto aidlMeasure = NN_TRY(hal::utils::makeExecutionFailure(convert(measure))); @@ -127,7 +128,8 @@ PreparedModel::executeFenced(const nn::Request& request, const std::vector maybeRequestInShared; hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation)); + &request, nn::kDefaultRequestMemoryAlignment, nn::kDefaultRequestMemoryPadding, + &maybeRequestInShared, &relocation)); const auto aidlRequest = NN_TRY(convert(requestInShared)); const auto aidlWaitFor = NN_TRY(convert(waitFor)); @@ -197,7 +199,8 @@ nn::GeneralResult PreparedModel::createReusableExecution( std::optional maybeRequestInShared; hal::utils::RequestRelocation relocation; const nn::Request& requestInShared = NN_TRY(hal::utils::convertRequestFromPointerToShared( - &request, &maybeRequestInShared, &relocation)); + &request, nn::kDefaultRequestMemoryAlignment, nn::kDefaultRequestMemoryPadding, + &maybeRequestInShared, &relocation)); auto aidlRequest = NN_TRY(convert(requestInShared)); auto aidlMeasure = NN_TRY(convert(measure)); diff --git a/neuralnetworks/utils/common/include/nnapi/hal/CommonUtils.h b/neuralnetworks/utils/common/include/nnapi/hal/CommonUtils.h index fdc90dfb41..702ee92da8 100644 --- a/neuralnetworks/utils/common/include/nnapi/hal/CommonUtils.h +++ b/neuralnetworks/utils/common/include/nnapi/hal/CommonUtils.h @@ -122,8 +122,8 @@ struct RequestRelocation { // Unlike `flushDataFromPointerToShared`, this method will not copy the input pointer data to the // shared memory pool. Use `relocationOut` to flush the input or output data after the call. nn::GeneralResult> convertRequestFromPointerToShared( - const nn::Request* request, std::optional* maybeRequestInSharedOut, - RequestRelocation* relocationOut); + const nn::Request* request, uint32_t alignment, uint32_t padding, + std::optional* maybeRequestInSharedOut, RequestRelocation* relocationOut); nn::GeneralResult> countNumberOfConsumers( size_t numberOfOperands, const std::vector& operations); diff --git a/neuralnetworks/utils/common/src/CommonUtils.cpp b/neuralnetworks/utils/common/src/CommonUtils.cpp index eaeb9ad872..8e55bf0253 100644 --- a/neuralnetworks/utils/common/src/CommonUtils.cpp +++ b/neuralnetworks/utils/common/src/CommonUtils.cpp @@ -220,8 +220,8 @@ void OutputRelocationTracker::flush() const { } nn::GeneralResult> convertRequestFromPointerToShared( - const nn::Request* request, std::optional* maybeRequestInSharedOut, - RequestRelocation* relocationOut) { + const nn::Request* request, uint32_t alignment, uint32_t padding, + std::optional* maybeRequestInSharedOut, RequestRelocation* relocationOut) { CHECK(request != nullptr); CHECK(maybeRequestInSharedOut != nullptr); CHECK(relocationOut != nullptr); @@ -249,7 +249,7 @@ nn::GeneralResult> convertRequestFromP const void* data = std::visit([](auto ptr) { return static_cast(ptr); }, location.pointer); CHECK(data != nullptr); - input.location = inputBuilder.append(location.length); + input.location = inputBuilder.append(location.length, alignment, padding); inputRelocationInfos.push_back({data, input.location.length, input.location.offset}); } @@ -273,7 +273,7 @@ nn::GeneralResult> convertRequestFromP output.lifetime = nn::Request::Argument::LifeTime::POOL; void* data = std::get(location.pointer); CHECK(data != nullptr); - output.location = outputBuilder.append(location.length); + output.location = outputBuilder.append(location.length, alignment, padding); outputRelocationInfos.push_back({data, output.location.length, output.location.offset}); }