mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 16:23:37 +00:00
Merge changes from topic "nnapi-aidl-burst"
* changes: Add Burst tests to NN AIDL HAL VTS Add IBurst to NN AIDL HAL -- hal Format NN AIDL HAL
This commit is contained in:
committed by
Android (Google) Code Review
commit
89d463fc3c
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (C) 2021 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// This file is a snapshot of an AIDL file. Do not edit it manually. There are
|
||||
// two cases:
|
||||
// 1). this is a frozen version file - do not edit this in any case.
|
||||
// 2). this is a 'current' file. If you make a backwards compatible change to
|
||||
// the interface (from the latest frozen version), the build system will
|
||||
// prompt you to update this file with `m <name>-update-api`.
|
||||
//
|
||||
// You must not make a backward incompatible change to any AIDL file built
|
||||
// with the aidl_interface module type with versions property set. The module
|
||||
// type is used to build AIDL files in a way that they can be used across
|
||||
// independently updatable components of the system. If a device is shipped
|
||||
// with such a backward incompatible change, it has a high risk of breaking
|
||||
// later when a module using the interface is updated, e.g., Mainline modules.
|
||||
|
||||
package android.hardware.neuralnetworks;
|
||||
@VintfStability
|
||||
interface IBurst {
|
||||
android.hardware.neuralnetworks.ExecutionResult executeSynchronously(in android.hardware.neuralnetworks.Request request, in long[] memoryIdentifierTokens, in boolean measureTiming, in long deadline, in long loopTimeoutDuration);
|
||||
void releaseMemoryResource(in long memoryIdentifierToken);
|
||||
}
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -35,6 +36,7 @@ package android.hardware.neuralnetworks;
|
||||
interface IPreparedModel {
|
||||
android.hardware.neuralnetworks.ExecutionResult executeSynchronously(in android.hardware.neuralnetworks.Request request, in boolean measureTiming, in long deadline, in long loopTimeoutDuration);
|
||||
android.hardware.neuralnetworks.FencedExecutionResult executeFenced(in android.hardware.neuralnetworks.Request request, in ParcelFileDescriptor[] waitFor, in boolean measureTiming, in long deadline, in long loopTimeoutDuration, in long duration);
|
||||
android.hardware.neuralnetworks.IBurst configureExecutionBurst();
|
||||
const long DEFAULT_LOOP_TIMEOUT_DURATION_NS = 2000000000;
|
||||
const long MAXIMUM_LOOP_TIMEOUT_DURATION_NS = 15000000000;
|
||||
}
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*////////////////////////////////////////////////////////////////////////////////
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
120
neuralnetworks/aidl/android/hardware/neuralnetworks/IBurst.aidl
Normal file
120
neuralnetworks/aidl/android/hardware/neuralnetworks/IBurst.aidl
Normal file
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Copyright (C) 2021 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.hardware.neuralnetworks;
|
||||
|
||||
import android.hardware.neuralnetworks.ErrorStatus;
|
||||
import android.hardware.neuralnetworks.ExecutionResult;
|
||||
import android.hardware.neuralnetworks.Request;
|
||||
|
||||
/**
|
||||
* IBurst represents a burst execution object.
|
||||
*
|
||||
* Burst executions are a sequence of executions of the same prepared model that occur in rapid
|
||||
* succession, such as frames of a camera capture or successive audio samples. A burst object is
|
||||
* used to control a set of burst executions, and to preserve resources between executions, enabling
|
||||
* executions to have lower overhead. Burst objects enable some optimizations:
|
||||
* (1) A burst object is created before a sequence of executions, and freed when the sequence has
|
||||
* ended. Because of this, the lifetime of the burst object hints to a driver how long it should
|
||||
* remain in a high performance state.
|
||||
* (2) A burst object can preserve resources between executions. For example, a driver can map a
|
||||
* memory object on the first execution and cache the mapping in the burst object for reuse in
|
||||
* subsequent executions. Any cached resource can be released when the burst object is destroyed
|
||||
* or when the NNAPI runtime notifies the burst object that the resource is no longer required.
|
||||
* (3) A burst object may be used for at most one execution at a time. This enables any transient
|
||||
* execution resources such as intermediate tensors to be allocated once when the burst object
|
||||
* is created and freed when the burst object is destroyed.
|
||||
*/
|
||||
@VintfStability
|
||||
interface IBurst {
|
||||
/**
|
||||
* Performs a synchronous execution on a burst object.
|
||||
*
|
||||
* The execution is performed synchronously with respect to the caller. executeSynchronously
|
||||
* must verify the inputs to the function are correct, and the usages of memory pools allocated
|
||||
* by IDevice::allocate are valid. If there is an error, executeSynchronously must immediately
|
||||
* return a service specific exception with the appropriate ErrorStatus value. If the inputs to
|
||||
* the function are valid and there is no error, executeSynchronously must perform the
|
||||
* execution, and must not return until the execution is complete.
|
||||
*
|
||||
* The caller must not change the content of any data object referenced by 'request' (described
|
||||
* by the {@link DataLocation} of a {@link RequestArgument}) until executeSynchronously returns.
|
||||
* executeSynchronously must not change the content of any of the data objects corresponding to
|
||||
* 'request' inputs.
|
||||
*
|
||||
* If the burst object was configured from a prepared model wherein all tensor operands have
|
||||
* fully specified dimensions, and the inputs to the function are valid, and at execution time
|
||||
* every operation's input operands have legal values, then the execution should complete
|
||||
* successfully: there must be no failure unless the device itself is in a bad state.
|
||||
*
|
||||
* executeSynchronously may be called with an optional deadline. If the execution is not able to
|
||||
* be completed before the provided deadline, the execution may be aborted, and either
|
||||
* {@link ErrorStatus::MISSED_DEADLINE_TRANSIENT} or {@link
|
||||
* ErrorStatus::MISSED_DEADLINE_PERSISTENT} may be returned. The error due to an abort must be
|
||||
* sent the same way as other errors, described above.
|
||||
*
|
||||
* Only a single execution on a given burst object may be active at any time.
|
||||
*
|
||||
* @param request The input and output information on which the prepared model is to be
|
||||
* executed.
|
||||
* @param memoryIdentifierTokens A list of tokens where each token is a non-negative number
|
||||
* that uniquely identifies a memory object. Each memory
|
||||
* identifier token corresponds to an element of request.pools. A
|
||||
* value of -1 indicates no identity.
|
||||
* @param measure Specifies whether or not to measure duration of the execution. The duration
|
||||
* runs from the time the driver sees the call to the executeSynchronously
|
||||
* function to the time the driver returns from the function.
|
||||
* @param deadline The time by which the execution is expected to complete. The time is measured
|
||||
* in nanoseconds since epoch of the steady clock (as from
|
||||
* std::chrono::steady_clock). If the execution cannot be finished by the
|
||||
* deadline, the execution may be aborted. Passing -1 means the deadline is
|
||||
* omitted. Other negative values are invalid.
|
||||
* @param loopTimeoutDuration The maximum amount of time in nanoseconds that should be spent
|
||||
* executing a {@link OperationType::WHILE} operation. If a loop
|
||||
* condition model does not output false within this duration, the
|
||||
* execution must be aborted. If -1 is provided, the maximum amount
|
||||
* of time is {@link DEFAULT_LOOP_TIMEOUT_DURATION_NS}. Other
|
||||
* negative values are invalid. When provided, the duration must not
|
||||
* exceed {@link MAXIMUM_LOOP_TIMEOUT_DURATION_NS}.
|
||||
* @return ExecutionResult parcelable, containing the status of the execution, output shapes and
|
||||
* timing information.
|
||||
* @throws ServiceSpecificException with one of the following ErrorStatus values:
|
||||
* - DEVICE_UNAVAILABLE if driver is offline or busy
|
||||
* - GENERAL_FAILURE if there is an unspecified error
|
||||
* - INVALID_ARGUMENT if one of the input arguments is invalid
|
||||
* - MISSED_DEADLINE_* if the execution is aborted because it cannot be completed by the
|
||||
* deadline
|
||||
* - RESOURCE_EXHAUSTED_* if the task was aborted by the driver
|
||||
*/
|
||||
ExecutionResult executeSynchronously(in Request request, in long[] memoryIdentifierTokens,
|
||||
in boolean measureTiming, in long deadline, in long loopTimeoutDuration);
|
||||
|
||||
/**
|
||||
* releaseMemoryResource is used by the client to signal to the service that a memory buffer
|
||||
* corresponding to a slot number is no longer needed by the client, and any cached resources
|
||||
* associated with that memory object may be released.
|
||||
*
|
||||
* The identifier tokens are unique to the burst object.
|
||||
*
|
||||
* @param memoryIdentifierToken Value uniquely identifying a memory object that is no longer
|
||||
* used.
|
||||
* @throws ServiceSpecificException with one of the following ErrorStatus values:
|
||||
* - DEVICE_UNAVAILABLE if driver is offline or busy
|
||||
* - GENERAL_FAILURE if there is an unspecified error
|
||||
* - INVALID_ARGUMENT if one of the input arguments is invalid
|
||||
*/
|
||||
void releaseMemoryResource(in long memoryIdentifierToken);
|
||||
}
|
||||
@@ -20,6 +20,7 @@ import android.hardware.common.NativeHandle;
|
||||
import android.hardware.neuralnetworks.ErrorStatus;
|
||||
import android.hardware.neuralnetworks.ExecutionResult;
|
||||
import android.hardware.neuralnetworks.FencedExecutionResult;
|
||||
import android.hardware.neuralnetworks.IBurst;
|
||||
import android.hardware.neuralnetworks.Request;
|
||||
|
||||
/**
|
||||
@@ -166,4 +167,22 @@ interface IPreparedModel {
|
||||
FencedExecutionResult executeFenced(in Request request, in ParcelFileDescriptor[] waitFor,
|
||||
in boolean measureTiming, in long deadline, in long loopTimeoutDuration,
|
||||
in long duration);
|
||||
|
||||
/**
|
||||
* Configure a Burst object used to execute multiple inferences on a prepared model in rapid
|
||||
* succession.
|
||||
*
|
||||
* If the prepared model was prepared from a model wherein all tensor operands have fully
|
||||
* specified dimensions, and a valid serialized Request is sent to the Burst for execution, and
|
||||
* at execution time every operation's input operands have legal values, then the execution
|
||||
* should complete successfully (ErrorStatus::NONE): There must be no failure unless the device
|
||||
* itself is in a bad state.
|
||||
*
|
||||
* @return burst Execution burst controller object.
|
||||
* @throws ServiceSpecificException with one of the following ErrorStatus values:
|
||||
* - DEVICE_UNAVAILABLE if driver is offline or busy
|
||||
* - GENERAL_FAILURE if there is an unspecified error
|
||||
* - RESOURCE_EXHAUSTED_* if the task was aborted by the driver
|
||||
*/
|
||||
IBurst configureExecutionBurst();
|
||||
}
|
||||
|
||||
@@ -39,6 +39,8 @@ class MockPreparedModel final : public BnPreparedModel {
|
||||
bool measureTiming, int64_t deadline, int64_t loopTimeoutDuration,
|
||||
int64_t duration, FencedExecutionResult* fencedExecutionResult),
|
||||
(override));
|
||||
MOCK_METHOD(ndk::ScopedAStatus, configureExecutionBurst, (std::shared_ptr<IBurst> * burst),
|
||||
(override));
|
||||
};
|
||||
|
||||
inline std::shared_ptr<MockPreparedModel> MockPreparedModel::create() {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "GeneratedTestHarness.h"
|
||||
|
||||
#include <aidl/android/hardware/neuralnetworks/ErrorStatus.h>
|
||||
#include <aidl/android/hardware/neuralnetworks/RequestMemoryPool.h>
|
||||
#include <android-base/logging.h>
|
||||
#include <android/binder_auto_utils.h>
|
||||
#include <android/sync.h>
|
||||
@@ -582,6 +583,53 @@ void EvaluatePreparedModel(const std::shared_ptr<IDevice>& device,
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Executor::BURST: {
|
||||
SCOPED_TRACE("burst");
|
||||
|
||||
// create burst
|
||||
std::shared_ptr<IBurst> burst;
|
||||
auto ret = preparedModel->configureExecutionBurst(&burst);
|
||||
ASSERT_TRUE(ret.isOk()) << ret.getDescription();
|
||||
ASSERT_NE(nullptr, burst.get());
|
||||
|
||||
// associate a unique slot with each memory pool
|
||||
int64_t currentSlot = 0;
|
||||
std::vector<int64_t> slots;
|
||||
slots.reserve(request.pools.size());
|
||||
for (const auto& pool : request.pools) {
|
||||
if (pool.getTag() == RequestMemoryPool::Tag::pool) {
|
||||
slots.push_back(currentSlot++);
|
||||
} else {
|
||||
EXPECT_EQ(pool.getTag(), RequestMemoryPool::Tag::token);
|
||||
slots.push_back(-1);
|
||||
}
|
||||
}
|
||||
|
||||
ExecutionResult executionResult;
|
||||
// execute
|
||||
ret = burst->executeSynchronously(request, slots, testConfig.measureTiming, kNoDeadline,
|
||||
loopTimeoutDuration, &executionResult);
|
||||
ASSERT_TRUE(ret.isOk() || ret.getExceptionCode() == EX_SERVICE_SPECIFIC)
|
||||
<< ret.getDescription();
|
||||
if (ret.isOk()) {
|
||||
executionStatus = executionResult.outputSufficientSize
|
||||
? ErrorStatus::NONE
|
||||
: ErrorStatus::OUTPUT_INSUFFICIENT_SIZE;
|
||||
outputShapes = std::move(executionResult.outputShapes);
|
||||
timing = executionResult.timing;
|
||||
} else {
|
||||
executionStatus = static_cast<ErrorStatus>(ret.getServiceSpecificError());
|
||||
}
|
||||
|
||||
// Mark each slot as unused after the execution. This is unnecessary because the burst
|
||||
// is freed after this scope ends, but this is here to test the functionality.
|
||||
for (int64_t slot : slots) {
|
||||
ret = burst->releaseMemoryResource(slot);
|
||||
ASSERT_TRUE(ret.isOk()) << ret.getDescription();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case Executor::FENCED: {
|
||||
SCOPED_TRACE("fenced");
|
||||
ErrorStatus result = ErrorStatus::NONE;
|
||||
@@ -727,19 +775,19 @@ void EvaluatePreparedModel(const std::shared_ptr<IDevice>& device,
|
||||
case TestKind::GENERAL: {
|
||||
outputTypesList = {OutputType::FULLY_SPECIFIED};
|
||||
measureTimingList = {false, true};
|
||||
executorList = {Executor::SYNC};
|
||||
executorList = {Executor::SYNC, Executor::BURST};
|
||||
memoryTypeList = {MemoryType::ASHMEM};
|
||||
} break;
|
||||
case TestKind::DYNAMIC_SHAPE: {
|
||||
outputTypesList = {OutputType::UNSPECIFIED, OutputType::INSUFFICIENT};
|
||||
measureTimingList = {false, true};
|
||||
executorList = {Executor::SYNC, Executor::FENCED};
|
||||
executorList = {Executor::SYNC, Executor::BURST, Executor::FENCED};
|
||||
memoryTypeList = {MemoryType::ASHMEM};
|
||||
} break;
|
||||
case TestKind::MEMORY_DOMAIN: {
|
||||
outputTypesList = {OutputType::FULLY_SPECIFIED};
|
||||
measureTimingList = {false};
|
||||
executorList = {Executor::SYNC, Executor::FENCED};
|
||||
executorList = {Executor::SYNC, Executor::BURST, Executor::FENCED};
|
||||
memoryTypeList = {MemoryType::BLOB_AHWB, MemoryType::DEVICE};
|
||||
} break;
|
||||
case TestKind::FENCED_COMPUTE: {
|
||||
@@ -755,7 +803,7 @@ void EvaluatePreparedModel(const std::shared_ptr<IDevice>& device,
|
||||
case TestKind::INTINITE_LOOP_TIMEOUT: {
|
||||
outputTypesList = {OutputType::MISSED_DEADLINE};
|
||||
measureTimingList = {false, true};
|
||||
executorList = {Executor::SYNC, Executor::FENCED};
|
||||
executorList = {Executor::SYNC, Executor::BURST, Executor::FENCED};
|
||||
memoryTypeList = {MemoryType::ASHMEM};
|
||||
} break;
|
||||
}
|
||||
@@ -779,7 +827,7 @@ void EvaluatePreparedCoupledModels(const std::shared_ptr<IDevice>& device,
|
||||
const TestModel& coupledModel) {
|
||||
const std::vector<OutputType> outputTypesList = {OutputType::FULLY_SPECIFIED};
|
||||
const std::vector<bool> measureTimingList = {false, true};
|
||||
const std::vector<Executor> executorList = {Executor::SYNC, Executor::FENCED};
|
||||
const std::vector<Executor> executorList = {Executor::SYNC, Executor::BURST, Executor::FENCED};
|
||||
|
||||
for (const OutputType outputType : outputTypesList) {
|
||||
for (const bool measureTiming : measureTimingList) {
|
||||
|
||||
@@ -203,6 +203,10 @@ class InvalidPreparedModel : public BnPreparedModel {
|
||||
return ndk::ScopedAStatus::fromServiceSpecificError(
|
||||
static_cast<int32_t>(ErrorStatus::GENERAL_FAILURE));
|
||||
}
|
||||
ndk::ScopedAStatus configureExecutionBurst(std::shared_ptr<IBurst>*) override {
|
||||
return ndk::ScopedAStatus::fromServiceSpecificError(
|
||||
static_cast<int32_t>(ErrorStatus::GENERAL_FAILURE));
|
||||
}
|
||||
};
|
||||
|
||||
template <typename... Args>
|
||||
@@ -866,6 +870,9 @@ class MemoryDomainExecutionTest
|
||||
case Executor::SYNC:
|
||||
EXPECT_EQ(executeSync(preparedModel, request), expectedStatus);
|
||||
break;
|
||||
case Executor::BURST:
|
||||
EXPECT_EQ(executeBurst(preparedModel, request), expectedStatus);
|
||||
break;
|
||||
case Executor::FENCED:
|
||||
EXPECT_EQ(executeFenced(preparedModel, request), expectedStatus);
|
||||
break;
|
||||
@@ -916,6 +923,35 @@ class MemoryDomainExecutionTest
|
||||
return executionStatus;
|
||||
}
|
||||
|
||||
ErrorStatus executeBurst(const std::shared_ptr<IPreparedModel>& preparedModel,
|
||||
const Request& request) {
|
||||
// create burst
|
||||
std::shared_ptr<IBurst> burst;
|
||||
auto ret = preparedModel->configureExecutionBurst(&burst);
|
||||
EXPECT_TRUE(ret.isOk()) << ret.getDescription();
|
||||
EXPECT_NE(nullptr, burst.get());
|
||||
if (!ret.isOk() || burst.get() == nullptr) {
|
||||
return ErrorStatus::GENERAL_FAILURE;
|
||||
}
|
||||
|
||||
// use -1 for all memory identifier tokens
|
||||
const std::vector<int64_t> slots(request.pools.size(), -1);
|
||||
|
||||
ExecutionResult executionResult;
|
||||
ret = burst->executeSynchronously(request, slots, false, kNoDeadline,
|
||||
kOmittedTimeoutDuration, &executionResult);
|
||||
|
||||
if (!ret.isOk()) {
|
||||
EXPECT_EQ(ret.getExceptionCode(), EX_SERVICE_SPECIFIC);
|
||||
return static_cast<ErrorStatus>(ret.getServiceSpecificError());
|
||||
}
|
||||
const ErrorStatus executionStatus = executionResult.outputSufficientSize
|
||||
? ErrorStatus::NONE
|
||||
: ErrorStatus::OUTPUT_INSUFFICIENT_SIZE;
|
||||
EXPECT_EQ(executionResult.timing, kNoTiming);
|
||||
return executionStatus;
|
||||
}
|
||||
|
||||
const Executor kExecutor = std::get<Executor>(GetParam());
|
||||
};
|
||||
|
||||
@@ -1159,7 +1195,7 @@ TEST_P(MemoryDomainExecutionTest, InvalidDimensions) {
|
||||
ErrorStatus::GENERAL_FAILURE);
|
||||
}
|
||||
|
||||
const auto kExecutorChoices = testing::Values(Executor::SYNC, Executor::FENCED);
|
||||
const auto kExecutorChoices = testing::Values(Executor::SYNC, Executor::BURST, Executor::FENCED);
|
||||
|
||||
std::string printMemoryDomainExecutionTest(
|
||||
const testing::TestParamInfo<MemoryDomainExecutionTestParam>& info) {
|
||||
|
||||
@@ -51,6 +51,10 @@ constexpr auto kShortDuration = std::chrono::milliseconds{5};
|
||||
using Results = std::tuple<ErrorStatus, std::vector<OutputShape>, Timing>;
|
||||
using MaybeResults = std::optional<Results>;
|
||||
|
||||
using ExecutionFunction =
|
||||
std::function<MaybeResults(const std::shared_ptr<IPreparedModel>& preparedModel,
|
||||
const Request& request, int64_t deadline)>;
|
||||
|
||||
static int64_t makeDeadline(DeadlineBoundType deadlineBoundType) {
|
||||
const auto getNanosecondsSinceEpoch = [](const auto& time) -> int64_t {
|
||||
const auto timeSinceEpoch = time.time_since_epoch();
|
||||
@@ -177,13 +181,53 @@ static MaybeResults executeSynchronously(const std::shared_ptr<IPreparedModel>&
|
||||
std::move(executionResult.outputShapes), executionResult.timing});
|
||||
}
|
||||
|
||||
static MaybeResults executeBurst(const std::shared_ptr<IPreparedModel>& preparedModel,
|
||||
const Request& request, int64_t deadline) {
|
||||
SCOPED_TRACE("burst");
|
||||
const bool measure = false;
|
||||
|
||||
// create burst
|
||||
std::shared_ptr<IBurst> burst;
|
||||
auto ret = preparedModel->configureExecutionBurst(&burst);
|
||||
EXPECT_TRUE(ret.isOk()) << ret.getDescription();
|
||||
EXPECT_NE(nullptr, burst.get());
|
||||
if (!ret.isOk() || burst.get() == nullptr) {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
// use -1 for all memory identifier tokens
|
||||
const std::vector<int64_t> slots(request.pools.size(), -1);
|
||||
|
||||
// run execution
|
||||
ExecutionResult executionResult;
|
||||
ret = burst->executeSynchronously(request, slots, measure, deadline, kOmittedTimeoutDuration,
|
||||
&executionResult);
|
||||
EXPECT_TRUE(ret.isOk() || ret.getExceptionCode() == EX_SERVICE_SPECIFIC)
|
||||
<< ret.getDescription();
|
||||
if (!ret.isOk()) {
|
||||
if (ret.getExceptionCode() != EX_SERVICE_SPECIFIC) {
|
||||
return std::nullopt;
|
||||
}
|
||||
return MaybeResults(
|
||||
{static_cast<ErrorStatus>(ret.getServiceSpecificError()), {}, kNoTiming});
|
||||
}
|
||||
|
||||
// return results
|
||||
return MaybeResults({executionResult.outputSufficientSize
|
||||
? ErrorStatus::NONE
|
||||
: ErrorStatus::OUTPUT_INSUFFICIENT_SIZE,
|
||||
std::move(executionResult.outputShapes), executionResult.timing});
|
||||
}
|
||||
|
||||
void runExecutionTest(const std::shared_ptr<IPreparedModel>& preparedModel,
|
||||
const TestModel& testModel, const Request& request,
|
||||
const ExecutionContext& context, DeadlineBoundType deadlineBound) {
|
||||
const ExecutionContext& context, bool synchronous,
|
||||
DeadlineBoundType deadlineBound) {
|
||||
const ExecutionFunction execute = synchronous ? executeSynchronously : executeBurst;
|
||||
const auto deadline = makeDeadline(deadlineBound);
|
||||
|
||||
// Perform execution and unpack results.
|
||||
const auto results = executeSynchronously(preparedModel, request, deadline);
|
||||
const auto results = execute(preparedModel, request, deadline);
|
||||
if (!results.has_value()) return;
|
||||
const auto& [status, outputShapes, timing] = results.value();
|
||||
|
||||
@@ -235,8 +279,11 @@ void runExecutionTest(const std::shared_ptr<IPreparedModel>& preparedModel,
|
||||
void runExecutionTests(const std::shared_ptr<IPreparedModel>& preparedModel,
|
||||
const TestModel& testModel, const Request& request,
|
||||
const ExecutionContext& context) {
|
||||
for (auto deadlineBound : deadlineBounds) {
|
||||
runExecutionTest(preparedModel, testModel, request, context, deadlineBound);
|
||||
for (bool synchronous : {false, true}) {
|
||||
for (auto deadlineBound : deadlineBounds) {
|
||||
runExecutionTest(preparedModel, testModel, request, context, synchronous,
|
||||
deadlineBound);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,9 @@
|
||||
|
||||
#define LOG_TAG "neuralnetworks_aidl_hal_test"
|
||||
|
||||
#include <aidl/android/hardware/neuralnetworks/RequestMemoryPool.h>
|
||||
#include <android/binder_auto_utils.h>
|
||||
#include <variant>
|
||||
|
||||
#include <chrono>
|
||||
|
||||
@@ -77,6 +79,35 @@ static void validate(const std::shared_ptr<IPreparedModel>& preparedModel,
|
||||
ASSERT_EQ(static_cast<ErrorStatus>(executeStatus.getServiceSpecificError()),
|
||||
ErrorStatus::INVALID_ARGUMENT);
|
||||
}
|
||||
|
||||
// burst
|
||||
{
|
||||
SCOPED_TRACE(message + " [burst]");
|
||||
|
||||
// create burst
|
||||
std::shared_ptr<IBurst> burst;
|
||||
auto ret = preparedModel->configureExecutionBurst(&burst);
|
||||
ASSERT_TRUE(ret.isOk()) << ret.getDescription();
|
||||
ASSERT_NE(nullptr, burst.get());
|
||||
|
||||
// use -1 for all memory identifier tokens
|
||||
const std::vector<int64_t> slots(request.pools.size(), -1);
|
||||
|
||||
ExecutionResult executionResult;
|
||||
const auto executeStatus = burst->executeSynchronously(
|
||||
request, slots, measure, kNoDeadline, kOmittedTimeoutDuration, &executionResult);
|
||||
ASSERT_FALSE(executeStatus.isOk());
|
||||
ASSERT_EQ(executeStatus.getExceptionCode(), EX_SERVICE_SPECIFIC);
|
||||
ASSERT_EQ(static_cast<ErrorStatus>(executeStatus.getServiceSpecificError()),
|
||||
ErrorStatus::INVALID_ARGUMENT);
|
||||
}
|
||||
}
|
||||
|
||||
std::shared_ptr<IBurst> createBurst(const std::shared_ptr<IPreparedModel>& preparedModel) {
|
||||
std::shared_ptr<IBurst> burst;
|
||||
const auto ret = preparedModel->configureExecutionBurst(&burst);
|
||||
if (!ret.isOk()) return nullptr;
|
||||
return burst;
|
||||
}
|
||||
|
||||
///////////////////////// REMOVE INPUT ////////////////////////////////////
|
||||
@@ -110,6 +141,65 @@ void validateRequest(const std::shared_ptr<IPreparedModel>& preparedModel, const
|
||||
removeOutputTest(preparedModel, request);
|
||||
}
|
||||
|
||||
void validateBurst(const std::shared_ptr<IPreparedModel>& preparedModel, const Request& request) {
|
||||
// create burst
|
||||
std::shared_ptr<IBurst> burst;
|
||||
auto ret = preparedModel->configureExecutionBurst(&burst);
|
||||
ASSERT_TRUE(ret.isOk()) << ret.getDescription();
|
||||
ASSERT_NE(nullptr, burst.get());
|
||||
|
||||
const auto test = [&burst, &request](const std::vector<int64_t>& slots) {
|
||||
ExecutionResult executionResult;
|
||||
const auto executeStatus =
|
||||
burst->executeSynchronously(request, slots, /*measure=*/false, kNoDeadline,
|
||||
kOmittedTimeoutDuration, &executionResult);
|
||||
ASSERT_FALSE(executeStatus.isOk());
|
||||
ASSERT_EQ(executeStatus.getExceptionCode(), EX_SERVICE_SPECIFIC);
|
||||
ASSERT_EQ(static_cast<ErrorStatus>(executeStatus.getServiceSpecificError()),
|
||||
ErrorStatus::INVALID_ARGUMENT);
|
||||
};
|
||||
|
||||
int64_t currentSlot = 0;
|
||||
std::vector<int64_t> slots;
|
||||
slots.reserve(request.pools.size());
|
||||
for (const auto& pool : request.pools) {
|
||||
if (pool.getTag() == RequestMemoryPool::Tag::pool) {
|
||||
slots.push_back(currentSlot++);
|
||||
} else {
|
||||
slots.push_back(-1);
|
||||
}
|
||||
}
|
||||
|
||||
constexpr int64_t invalidSlot = -2;
|
||||
|
||||
// validate failure when invalid memory identifier token value
|
||||
for (size_t i = 0; i < request.pools.size(); ++i) {
|
||||
const int64_t oldSlotValue = slots[i];
|
||||
|
||||
slots[i] = invalidSlot;
|
||||
test(slots);
|
||||
|
||||
slots[i] = oldSlotValue;
|
||||
}
|
||||
|
||||
// validate failure when request.pools.size() != memoryIdentifierTokens.size()
|
||||
if (request.pools.size() > 0) {
|
||||
slots = std::vector<int64_t>(request.pools.size() - 1, -1);
|
||||
test(slots);
|
||||
}
|
||||
|
||||
// validate failure when request.pools.size() != memoryIdentifierTokens.size()
|
||||
slots = std::vector<int64_t>(request.pools.size() + 1, -1);
|
||||
test(slots);
|
||||
|
||||
// validate failure when invalid memory identifier token value
|
||||
const auto freeStatus = burst->releaseMemoryResource(invalidSlot);
|
||||
ASSERT_FALSE(freeStatus.isOk());
|
||||
ASSERT_EQ(freeStatus.getExceptionCode(), EX_SERVICE_SPECIFIC);
|
||||
ASSERT_EQ(static_cast<ErrorStatus>(freeStatus.getServiceSpecificError()),
|
||||
ErrorStatus::INVALID_ARGUMENT);
|
||||
}
|
||||
|
||||
void validateRequestFailure(const std::shared_ptr<IPreparedModel>& preparedModel,
|
||||
const Request& request) {
|
||||
SCOPED_TRACE("Expecting request to fail [executeSynchronously]");
|
||||
|
||||
@@ -127,6 +127,8 @@ void validateModel(const std::shared_ptr<IDevice>& device, const Model& model);
|
||||
// Forward declaration from ValidateRequest.cpp
|
||||
void validateRequest(const std::shared_ptr<IPreparedModel>& preparedModel, const Request& request);
|
||||
// Forward declaration from ValidateRequest.cpp
|
||||
void validateBurst(const std::shared_ptr<IPreparedModel>& preparedModel, const Request& request);
|
||||
// Forward declaration from ValidateRequest.cpp
|
||||
void validateRequestFailure(const std::shared_ptr<IPreparedModel>& preparedModel,
|
||||
const Request& request);
|
||||
|
||||
@@ -140,6 +142,7 @@ void validateEverything(const std::shared_ptr<IDevice>& device, const Model& mod
|
||||
if (preparedModel == nullptr) return;
|
||||
|
||||
validateRequest(preparedModel, request);
|
||||
validateBurst(preparedModel, request);
|
||||
// HIDL also had test that expected executeFenced to fail on received null fd (-1). This is not
|
||||
// allowed in AIDL and will result in EX_TRANSACTION_FAILED.
|
||||
}
|
||||
@@ -178,8 +181,6 @@ INSTANTIATE_GENERATED_TEST(ValidationTest, [](const std::string& testName) {
|
||||
|
||||
std::string toString(Executor executor) {
|
||||
switch (executor) {
|
||||
case Executor::ASYNC:
|
||||
return "ASYNC";
|
||||
case Executor::SYNC:
|
||||
return "SYNC";
|
||||
case Executor::BURST:
|
||||
|
||||
@@ -52,7 +52,7 @@ void createPreparedModel(const std::shared_ptr<IDevice>& device, const Model& mo
|
||||
std::shared_ptr<IPreparedModel>* preparedModel,
|
||||
bool reportSkipping = true);
|
||||
|
||||
enum class Executor { ASYNC, SYNC, BURST, FENCED };
|
||||
enum class Executor { SYNC, BURST, FENCED };
|
||||
|
||||
std::string toString(Executor executor);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user