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

Commit 1b4b30d0 authored by Xusong Wang's avatar Xusong Wang Committed by Gerrit Code Review
Browse files

Merge changes from topics "aosp-nnapi-1.3-operations", "aosp-nnapi-async-cmdqueue"

* changes:
  Fix the NNAPI vts tests about validateExecuteFenced
  Add VTS tests for NNAPI IPreparedModel::executeFenced
  Support sync fence in NNAPI
  Add FILL and RANK ops
  Add ELU and HARD_SWISH
  NNAPI: Regenerate types.hal to sync with types.spec
parents 568b3910 e51e4a9f
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -625,9 +625,10 @@ ac429fca0da4ce91218768ec31b64ded88251f8a26d8c4f27c06abdc5b1926d9 android.hardwar
65c16331e57f6dd68b3971f06f78fe9e3209afb60630c31705aa355f9a52bf0d android.hardware.neuralnetworks@1.3::IBuffer
d1f382d14e1384b907d5bb5780df7f01934650d556fedbed2f15a90773c657d6 android.hardware.neuralnetworks@1.3::IDevice
4167dc3ad35e9cd0d2057d4868c7675ae2c3c9d05bbd614c1f5dccfa5fd68797 android.hardware.neuralnetworks@1.3::IExecutionCallback
7d23020248194abbee8091cc624f39a5a6d7ccba338b172d5d2d3df0cceffbee android.hardware.neuralnetworks@1.3::IPreparedModel
29e26e83399b69c7998b787bd30426dd5baa2da350effca76bbee1ba877355c9 android.hardware.neuralnetworks@1.3::IFencedExecutionCallback
384fd9fd6e4d43ea11d407e52ea81da5242c3c5f4b458b8707d8feb652a13e36 android.hardware.neuralnetworks@1.3::IPreparedModel
0439a1fbbec7f16e5e4c653d85ac685d51bfafbae15b8f8cca530acdd7d6a8ce android.hardware.neuralnetworks@1.3::IPreparedModelCallback
ee65638f8af3f9f4f222e7208eaa9f1f8e7f8e0a21545846ba67d0e27624efa1 android.hardware.neuralnetworks@1.3::types
5f1a4e0c29fc686ed476f9f04eed35e4405d21288cb2746b978d6891de5cc37d android.hardware.neuralnetworks@1.3::types
3e01d4446cd69fd1c48f8572efd97487bc179564b32bd795800b97bbe10be37b android.hardware.wifi@1.4::IWifi
a64467bae843569f0d465c5be7f0c7a5b987985b55a3ef4794dd5afc68538650 android.hardware.wifi.supplicant@1.3::ISupplicant
44445b8a03d7b9e68b2fbd954672c18a8fce9e32851b0692f4f4ab3407f86ecb android.hardware.wifi.supplicant@1.3::ISupplicantStaIface
+1 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ hidl_interface {
        "IBuffer.hal",
        "IDevice.hal",
        "IExecutionCallback.hal",
        "IFencedExecutionCallback.hal",
        "IPreparedModel.hal",
        "IPreparedModelCallback.hal",
    ],
+48 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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@1.3;

import @1.2::Timing;
import ErrorStatus;

/**
 * IFencedExecutionCallback can be used to query the error status result
 * and duration information from an IPreparedModel::executeFenced call.
 */
interface IFencedExecutionCallback {

    /**
     * The getExecutionInfo method is used by the clients to query error status
     * result and duration information. The method must only be called after the actual
     * evaluation has finished or resulted in an runtime error, as indicated by the status
     * of the sync fence returned by the IPreparedModel::executeFenced call, otherwise
     * GENERAL_FAILURE must be returned.
     *
     * @return status Error status returned from the asynchronously dispatched execution
     *                must be:
     *                - NONE if the asynchronous execution was successful
     *                - DEVICE_UNAVAILABLE if driver is offline or busy
     *                - GENERAL_FAILURE if the asynchronous task resulted in an
     *                  unspecified error
     * @return timing Duration of execution. Unless MeasureTiming::YES was passed when
     *                launching the execution and status is NONE, all times must
     *                be reported as UINT64_MAX. A driver may choose to report
     *                any time as UINT64_MAX, indicating that particular measurement is
     *                not available.
     */
    getExecutionInfo() generates (ErrorStatus status, Timing timing);
};
+56 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import ErrorStatus;
import OptionalTimePoint;
import Request;
import IExecutionCallback;
import IFencedExecutionCallback;

/**
 * IPreparedModel describes a model that has been prepared for execution and
@@ -91,7 +92,8 @@ interface IPreparedModel extends @1.2::IPreparedModel {
     *                 execution cannot be finished by the deadline, the
     *                 execution must be aborted.
     * @param callback A callback object used to return the error status of
     *                 the execution. The callback object's notify function must
     *                 the execution, shape information of model output operands, and
     *                 duration of execution. The callback object's notify function must
     *                 be called exactly once, even if the execution was
     *                 unsuccessful.
     * @return status Error status of the call, must be:
@@ -187,4 +189,57 @@ interface IPreparedModel extends @1.2::IPreparedModel {
                             OptionalTimePoint deadline)
                  generates (ErrorStatus status, vec<OutputShape> outputShapes,
                             Timing timing);

    /**
     * Launch a fenced asynchronous execution on a prepared model.
     *
     * The execution is performed asynchronously with respect to the caller.
     * executeFenced must fully validate the request, and only accept one that is
     * guaranteed to be completed, unless a hardware failure or kernel panic happens on the device.
     * If there is an error during validation, executeFenced must immediately return with
     * the corresponding ErrorStatus. If the request is valid and there is no error launching,
     * executeFenced must dispatch an asynchronous task to perform the execution in the
     * background, and immediately return with ErrorStatus::NONE, a sync_fence that will be
     * signaled once the execution is completed, and a callback that can be used by the client
     * to query the duration and runtime error status. If the task has finished
     * before the call returns, empty handle may be returned for the sync fence. If the
     * asynchronous task fails to launch, executeFenced must immediately return with
     * ErrorStatus::GENERAL_FAILURE, and empty handle for the sync fence and nullptr
     * for callback. The execution must wait for all the sync fences (if any) in wait_for to be
     * signaled before starting the actual execution.
     *
     * If any of sync fences in wait_for changes to error status after the executeFenced
     * call succeeds, the driver must immediately set the returned sync fence to error status.
     *
     * When the asynchronous task has finished its execution, it must
     * immediately signal the sync_fence created when dispatching. After
     * the sync_fence is signaled, the task must not modify the content of
     * any data object referenced by 'request' (described by the
     * {@link @1.0::DataLocation} of a {@link @1.0::RequestArgument}).
     *
     * Any number of calls to the executeFenced, execute* and executeSynchronously*
     * functions, in any combination, may be made concurrently, even on the same
     * IPreparedModel object.
     *
     * @param request The input and output information on which the prepared
     *                model is to be executed.
     * @param waitFor A vector of sync fence file descriptors.
     *                Execution must not start until all sync fences have been signaled.
     * @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 executeFenced function to the time sync_fence is triggered.
     * @return status Error status of the call, must be:
     *                - NONE if task is successfully launched
     *                - 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, including
     *                                   fences in error states.
     * @return syncFence The sync fence that will be triggered when the task is completed.
     *                   The sync fence will be set to error if a critical error,
     *                   e.g. hardware failure or kernel panic, occurs when doing execution.
     * @return callback The IFencedExecutionCallback can be used to query information like duration
     *                  and error status when the execution is completed.
     */
    executeFenced(Request request, vec<handle> waitFor, MeasureTiming measure)
        generates (ErrorStatus status, handle syncFence, IFencedExecutionCallback callback);
};
+116 −1
Original line number Diff line number Diff line
@@ -1415,6 +1415,7 @@ enum OperationType : int32_t {
     * * {@link OperandType::TENSOR_FLOAT32}
     * * {@link OperandType::TENSOR_QUANT8_ASYMM}
     * * {@link OperandType::TENSOR_QUANT8_ASYMM_SIGNED} (since HAL version 1.3)
     * * {@link OperandType::TENSOR_INT32} (since HAL version 1.3)
     *
     * Supported tensor rank: up to 4
     *
@@ -1425,6 +1426,8 @@ enum OperationType : int32_t {
     * * 2: An {@link OperandType::INT32} scalar, and has to be one of the
     *      {@link FusedActivationFunc} values. Specifies the activation to
     *      invoke on the result.
     *      For a {@link OperandType::TENSOR_INT32} tensor,
     *      the {@link FusedActivationFunc} must be "NONE".
     *
     * Outputs:
     * * 0: The product, a tensor of the same {@link OperandType} as input0.
@@ -1905,6 +1908,11 @@ enum OperationType : int32_t {
     * dimensions. The output is the result of dividing the first input tensor
     * by the second, optionally modified by an activation function.
     *
     * For inputs of {@link OperandType::TENSOR_INT32}, performs
     * "floor division" ("//" in Python). For example,
     *     5 // 2 = 2
     *    -5 // 2 = -3
     *
     * Two dimensions are compatible when:
     *     1. they are equal, or
     *     2. one of them is 1
@@ -1925,6 +1933,7 @@ enum OperationType : int32_t {
     * Supported tensor {@link OperandType}:
     * * {@link OperandType::TENSOR_FLOAT16} (since HAL version 1.2)
     * * {@link OperandType::TENSOR_FLOAT32}
     * * {@link OperandType::TENSOR_INT32} (since HAL version 1.3)
     *
     * Supported tensor rank: up to 4
     *
@@ -1935,6 +1944,8 @@ enum OperationType : int32_t {
     * * 2: An {@link OperandType::INT32} scalar, and has to be one of the
     *      {@link FusedActivationFunc} values. Specifies the activation to
     *      invoke on the result.
     *      For a {@link OperandType::TENSOR_INT32} tensor,
     *      the {@link FusedActivationFunc} must be "NONE".
     *
     * Outputs:
     * * 0: A tensor of the same {@link OperandType} as input0.
@@ -2186,6 +2197,7 @@ enum OperationType : int32_t {
     * * {@link OperandType::TENSOR_FLOAT32}
     * * {@link OperandType::TENSOR_QUANT8_ASYMM} (since HAL version 1.2)
     * * {@link OperandType::TENSOR_QUANT8_ASYMM_SIGNED} (since HAL version 1.3)
     * * {@link OperandType::TENSOR_INT32} (since HAL version 1.3)
     *
     * Supported tensor rank: up to 4
     *
@@ -2196,6 +2208,8 @@ enum OperationType : int32_t {
     * * 2: An {@link OperandType::INT32} scalar, and has to be one of the
     *      {@link FusedActivationFunc} values. Specifies the activation to
     *      invoke on the result.
     *      For a {@link OperandType::TENSOR_INT32} tensor,
     *      the {@link FusedActivationFunc} must be "NONE".
     *
     * Outputs:
     * * 0: A tensor of the same {@link OperandType} as input0.
@@ -2242,6 +2256,7 @@ enum OperationType : int32_t {
     * Supported tensor {@link OperandType}:
     * * {@link OperandType::TENSOR_FLOAT16}
     * * {@link OperandType::TENSOR_FLOAT32}
     * * {@link OperandType::TENSOR_INT32} (since HAL version 1.3)
     *
     * Supported tensor rank: from 1.
     *
@@ -4971,6 +4986,106 @@ enum OperationType : int32_t {
     */
    WHILE = 97,

    /**
     * Computes exponential linear activation on the input tensor element-wise.
     *
     * The output is calculated using the following formula:
     *
     *     ELU(x) = max(0, x) + min(0, alpha * (exp(x) - 1))
     *
     * Supported tensor {@link OperandType}:
     * * {@link OperandType::TENSOR_FLOAT16}
     * * {@link OperandType::TENSOR_FLOAT32}
     *
     * Inputs:
     * * 0: A tensor, specifying the input. May be zero-sized.
     * * 1: A scalar, specifying the alpha parameter.
     *      For input tensor of {@link OperandType::TENSOR_FLOAT16},
     *      the alpha value must be of {@link OperandType::FLOAT16}.
     *      For input tensor of {@link OperandType::TENSOR_FLOAT32},
     *      the alpha value must be of {@link OperandType::FLOAT32}.
     *
     * Outputs:
     * * 0: The output tensor of same shape and type as input0.
     */
    ELU = 98,

    /**
     * Computes hard-swish activation on the input tensor element-wise.
     *
     * Hard swish activation is introduced in
     * https://arxiv.org/pdf/1905.02244.pdf
     *
     * The output is calculated using the following formula:
     *
     *     h-swish(x) = x * max(0, min(6, (x + 3))) / 6

     * Supported tensor {@link OperandType}:
     * * {@link OperandType::TENSOR_FLOAT16}
     * * {@link OperandType::TENSOR_FLOAT32}
     * * {@link OperandType::TENSOR_QUANT8_ASYMM}
     * * {@link OperandType::TENSOR_QUANT8_ASYMM_SIGNED}
     *
     * Inputs:
     * * 0: A tensor, specifying the input. May be zero-sized.
     *
     * Outputs:
     * * 0: The output tensor of same shape and type as input0.
     *      Scale and zero point of this tensor may be different from the input
     *      tensor's parameters.
     */
    HARD_SWISH = 99,

    /**
     * Creates a tensor filled with a scalar value.
     *
     * Supported output tensor {@link OperandType}:
     * * {@link OperandType::TENSOR_FLOAT16}
     * * {@link OperandType::TENSOR_FLOAT32}
     * * {@link OperandType::TENSOR_INT32}
     *
     * Inputs:
     * * 0: A 1-D tensor, specifying the desired output tensor shape.
     * * 1: A scalar, specifying the value to fill the output tensors with.
     *      For output tensor of {@link OperandType::TENSOR_FLOAT16},
     *      the scalar must be of {@link OperandType::FLOAT16}.
     *      For output tensor of {@link OperandType::TENSOR_FLOAT32},
     *      the scalar must be of {@link OperandType::FLOAT32}.
     *      For output tensor of {@link OperandType::TENSOR_INT32},
     *      the scalar must be of {@link OperandType::INT32}.
     *
     * Outputs:
     * * 0: The output tensor.
     */
    FILL = 100,

    /**
     * Returns the rank of a tensor.
     *
     * The rank of a tensor is the number of dimensions in it. Also known as
     * "order", "degree", "ndims".
     *
     * Supported tensor {@link OperandType}:
     * * {@link OperandType::TENSOR_FLOAT16}
     * * {@link OperandType::TENSOR_FLOAT32}
     * * {@link OperandType::TENSOR_INT32}
     * * {@link OperandType::TENSOR_QUANT8_ASYMM}
     * * {@link OperandType::TENSOR_QUANT16_SYMM}
     * * {@link OperandType::TENSOR_BOOL8}
     * * {@link OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL}
     * * {@link OperandType::TENSOR_QUANT16_ASYMM}
     * * {@link OperandType::TENSOR_QUANT8_SYMM}
     * * {@link OperandType::TENSOR_QUANT8_ASYMM_SIGNED}
     *
     * Inputs:
     * * 0: The input tensor.
     *
     * Outputs:
     * * 0: A scalar of {@link OperandType::INT32}, specifying the rank
     *      of the input tensor.
     */
    RANK = 101,

    /**
     * DEPRECATED. Since NNAPI 1.2, extensions are the preferred alternative to
     * OEM operation and data types.
@@ -4993,7 +5108,7 @@ enum OperationType : int32_t {
enum OperationTypeRange : uint32_t {
    BASE_MIN        = 0,
    FUNDAMENTAL_MIN = 0,
    FUNDAMENTAL_MAX = 97,
    FUNDAMENTAL_MAX = 101,
    OEM_MIN         = 10000,
    OEM_MAX         = 10000,
    BASE_MAX        = 0xFFFF,
Loading