blob: e7d63f4851379044da93df14475c8dab8241750d [file] [log] [blame]
Xusong Wang62a760c2019-10-25 12:07:17 -07001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.hardware.neuralnetworks@1.3;
18
Xusong Wang62a760c2019-10-25 12:07:17 -070019import @1.2::IPreparedModel;
Xusong Wangebd88ba2019-10-28 11:11:19 -070020import @1.2::MeasureTiming;
21import @1.2::OutputShape;
22import @1.2::Timing;
Michael Butlerc2499ec2019-12-11 18:31:12 -080023import ErrorStatus;
Miao Wang3fd70b02020-01-21 13:15:09 -080024import OptionalTimeoutDuration;
Michael Butlerc2499ec2019-12-11 18:31:12 -080025import OptionalTimePoint;
Xusong Wang931d5a12019-11-27 12:46:48 -080026import Request;
Michael Butlerc2499ec2019-12-11 18:31:12 -080027import IExecutionCallback;
Miao Wang90cf3dd2019-11-12 14:02:16 -080028import IFencedExecutionCallback;
Xusong Wang62a760c2019-10-25 12:07:17 -070029
30/**
31 * IPreparedModel describes a model that has been prepared for execution and
32 * is used to launch executions.
33 */
34interface IPreparedModel extends @1.2::IPreparedModel {
35 /**
36 * Launches an asynchronous execution on a prepared model.
37 *
38 * The execution is performed asynchronously with respect to the caller.
Xusong Wang931d5a12019-11-27 12:46:48 -080039 * execute_1_3 must verify the inputs to the function are correct, and the usages
40 * of memory pools allocated by IDevice::allocate are valid. If there is
Xusong Wang62a760c2019-10-25 12:07:17 -070041 * an error, execute_1_3 must immediately invoke the callback with the
42 * appropriate ErrorStatus value, then return with the same ErrorStatus. If
43 * the inputs to the function are valid and there is no error, execute_1_3 must
44 * launch an asynchronous task to perform the execution in the background,
45 * and immediately return with ErrorStatus::NONE. If the asynchronous task
46 * fails to launch, execute_1_3 must immediately invoke the callback with
47 * ErrorStatus::GENERAL_FAILURE, then return with
48 * ErrorStatus::GENERAL_FAILURE.
49 *
50 * When the asynchronous task has finished its execution, it must
51 * immediately invoke the callback object provided as an input to the
52 * execute_1_3 function. This callback must be provided with the ErrorStatus of
53 * the execution.
54 *
55 * If the launch is successful, the caller must not change the content of
56 * any data object referenced by 'request' (described by the
57 * {@link @1.0::DataLocation} of a {@link @1.0::RequestArgument}) until the
58 * asynchronous task has invoked the callback object. The asynchronous task
59 * must not change the content of any of the data objects corresponding to
60 * 'request' inputs.
61 *
62 * If the prepared model was prepared from a model wherein all tensor
63 * operands have fully specified dimensions, and the inputs to the function
64 * are valid, then:
65 * - the execution should launch successfully (ErrorStatus::NONE): There
66 * must be no failure unless the device itself is in a bad state.
67 * - if at execution time every operation's input operands have legal
68 * values, the execution should complete successfully (ErrorStatus::NONE):
69 * There must be no failure unless the device itself is in a bad state.
70 *
Michael Butlerc2499ec2019-12-11 18:31:12 -080071 * execute_1_3 can be called with an optional deadline. If the execution
Miao Wang3fd70b02020-01-21 13:15:09 -080072 * is not able to be completed before the provided deadline, the execution
Michael Butler9b9a8042020-02-13 16:37:22 -080073 * may be aborted, and either {@link
Michael Butlerc2499ec2019-12-11 18:31:12 -080074 * ErrorStatus::MISSED_DEADLINE_TRANSIENT} or {@link
Michael Butler9b9a8042020-02-13 16:37:22 -080075 * ErrorStatus::MISSED_DEADLINE_PERSISTENT} may be returned. The error due
Michael Butlerc2499ec2019-12-11 18:31:12 -080076 * to an abort must be sent the same way as other errors, described above.
Michael Butlerc2499ec2019-12-11 18:31:12 -080077 *
Xusong Wangebd88ba2019-10-28 11:11:19 -070078 * Any number of calls to the execute* and executeSynchronously* functions,
79 * in any combination, may be made concurrently, even on the same
Xusong Wang62a760c2019-10-25 12:07:17 -070080 * IPreparedModel object.
81 *
82 * @param request The input and output information on which the prepared
83 * model is to be executed.
84 * @param measure Specifies whether or not to measure duration of the execution.
85 * The duration runs from the time the driver sees the call
86 * to the execute_1_3 function to the time the driver invokes
87 * the callback.
Michael Butler9b9a8042020-02-13 16:37:22 -080088 * @param deadline The time by which the execution is expected to complete.
89 * If the execution cannot be completed by the deadline, the
90 * execution may be aborted.
Slava Shklyaevf034bf92020-02-11 14:27:02 +000091 * @param loopTimeoutDuration The maximum amount of time that should be spent
92 * executing a {@link OperationType::WHILE}
93 * operation. If a loop condition model does not
94 * output false within this duration, the
Slava Shklyaev6a222a32020-04-07 13:20:47 +010095 * execution must be aborted. If no loop timeout
96 * duration is provided, the maximum amount of
97 * time is {@link LoopTimeoutDurationNs::DEFAULT}.
98 * When provided, the duration must not exceed
99 * {@link LoopTimeoutDurationNs::MAXIMUM}.
Xusong Wang62a760c2019-10-25 12:07:17 -0700100 * @param callback A callback object used to return the error status of
Miao Wang90cf3dd2019-11-12 14:02:16 -0800101 * the execution, shape information of model output operands, and
102 * duration of execution. The callback object's notify function must
Xusong Wang62a760c2019-10-25 12:07:17 -0700103 * be called exactly once, even if the execution was
104 * unsuccessful.
105 * @return status Error status of the call, must be:
106 * - NONE if task is successfully launched
107 * - DEVICE_UNAVAILABLE if driver is offline or busy
108 * - GENERAL_FAILURE if there is an unspecified error
109 * - OUTPUT_INSUFFICIENT_SIZE if provided output buffer is
110 * not large enough to store the resultant values
111 * - INVALID_ARGUMENT if one of the input arguments is
112 * invalid
Michael Butler9b9a8042020-02-13 16:37:22 -0800113 * - MISSED_DEADLINE_* if the execution is aborted because it
114 * cannot be completed by the deadline
Michael Butlerc2499ec2019-12-11 18:31:12 -0800115 * - RESOURCE_EXHAUSTED_* if the task was aborted by the
116 * driver
Xusong Wang62a760c2019-10-25 12:07:17 -0700117 */
Michael Butlerc2499ec2019-12-11 18:31:12 -0800118 execute_1_3(Request request, MeasureTiming measure, OptionalTimePoint deadline,
Slava Shklyaevf034bf92020-02-11 14:27:02 +0000119 OptionalTimeoutDuration loopTimeoutDuration, IExecutionCallback callback)
Xusong Wang62a760c2019-10-25 12:07:17 -0700120 generates (ErrorStatus status);
Xusong Wangebd88ba2019-10-28 11:11:19 -0700121
122 /**
123 * Performs a synchronous execution on a prepared model.
124 *
125 * The execution is performed synchronously with respect to the caller.
126 * executeSynchronously_1_3 must verify the inputs to the function are
Xusong Wang931d5a12019-11-27 12:46:48 -0800127 * correct, and the usages of memory pools allocated by IDevice::allocate
128 * are valid. If there is an error, executeSynchronously_1_3 must immediately
Xusong Wangebd88ba2019-10-28 11:11:19 -0700129 * return with the appropriate ErrorStatus value. If the inputs to the
130 * function are valid and there is no error, executeSynchronously_1_3 must
131 * perform the execution, and must not return until the execution is
132 * complete.
133 *
134 * The caller must not change the content of any data object referenced by
135 * 'request' (described by the {@link @1.0::DataLocation} of a
136 * {@link @1.0::RequestArgument}) until executeSynchronously_1_3
137 * returns. executeSynchronously_1_3 must not change the content of any of the
138 * data objects corresponding to 'request' inputs.
139 *
140 * If the prepared model was prepared from a model wherein all tensor
141 * operands have fully specified dimensions, and the inputs to the function
142 * are valid, and at execution time every operation's input operands have
143 * legal values, then the execution should complete successfully
144 * (ErrorStatus::NONE): There must be no failure unless the device itself is
145 * in a bad state.
146 *
Michael Butler9b9a8042020-02-13 16:37:22 -0800147 * executeSynchronously_1_3 may be called with an optional deadline. If the
Miao Wang3fd70b02020-01-21 13:15:09 -0800148 * execution is not able to be completed before the provided deadline, the
Michael Butler9b9a8042020-02-13 16:37:22 -0800149 * execution may be aborted, and either {@link
Michael Butlerc2499ec2019-12-11 18:31:12 -0800150 * ErrorStatus::MISSED_DEADLINE_TRANSIENT} or {@link
Michael Butler9b9a8042020-02-13 16:37:22 -0800151 * ErrorStatus::MISSED_DEADLINE_PERSISTENT} may be returned. The error due
Michael Butlerc2499ec2019-12-11 18:31:12 -0800152 * to an abort must be sent the same way as other errors, described above.
Michael Butlerc2499ec2019-12-11 18:31:12 -0800153 *
Xusong Wangebd88ba2019-10-28 11:11:19 -0700154 * Any number of calls to the execute* and executeSynchronously* functions,
155 * in any combination, may be made concurrently, even on the same
156 * IPreparedModel object.
157 *
158 * @param request The input and output information on which the prepared
159 * model is to be executed.
160 * @param measure Specifies whether or not to measure duration of the execution.
161 * The duration runs from the time the driver sees the call
162 * to the executeSynchronously_1_3 function to the time the driver
163 * returns from the function.
Michael Butler9b9a8042020-02-13 16:37:22 -0800164 * @param deadline The time by which the execution is expected to complete.
165 * If the execution cannot be finished by the deadline, the
166 * execution may be aborted.
Slava Shklyaevf034bf92020-02-11 14:27:02 +0000167 * @param loopTimeoutDuration The maximum amount of time that should be spent
168 * executing a {@link OperationType::WHILE}
169 * operation. If a loop condition model does not
170 * output false within this duration, the
Slava Shklyaev6a222a32020-04-07 13:20:47 +0100171 * execution must be aborted. If no loop timeout
172 * duration is provided, the maximum amount of
173 * time is {@link LoopTimeoutDurationNs::DEFAULT}.
174 * When provided, the duration must not exceed
175 * {@link LoopTimeoutDurationNs::MAXIMUM}.
Xusong Wangebd88ba2019-10-28 11:11:19 -0700176 * @return status Error status of the execution, must be:
177 * - NONE if execution is performed successfully
178 * - DEVICE_UNAVAILABLE if driver is offline or busy
179 * - GENERAL_FAILURE if there is an unspecified error
180 * - OUTPUT_INSUFFICIENT_SIZE if at least one output
181 * operand buffer is not large enough to store the
182 * corresponding output
183 * - INVALID_ARGUMENT if one of the input arguments is
184 * invalid
Michael Butler9b9a8042020-02-13 16:37:22 -0800185 * - MISSED_DEADLINE_* if the execution is aborted because it
186 * cannot be completed by the deadline
Michael Butlerc2499ec2019-12-11 18:31:12 -0800187 * - RESOURCE_EXHAUSTED_* if the task was aborted by the
188 * driver
Xusong Wangebd88ba2019-10-28 11:11:19 -0700189 * @return outputShapes A list of shape information of model output operands.
190 * The index into "outputShapes" corresponds to the index
191 * of the output operand in the Request outputs vector.
192 * outputShapes must be empty unless the status is either
193 * NONE or OUTPUT_INSUFFICIENT_SIZE.
Michael Butlerc2499ec2019-12-11 18:31:12 -0800194 * @return timing Duration of execution. Unless measure is YES and status is
Xusong Wangebd88ba2019-10-28 11:11:19 -0700195 * NONE, all times must be reported as UINT64_MAX. A driver may
196 * choose to report any time as UINT64_MAX, indicating that
197 * measurement is not available.
198 */
Michael Butlerc2499ec2019-12-11 18:31:12 -0800199 executeSynchronously_1_3(Request request, MeasureTiming measure,
Slava Shklyaevf034bf92020-02-11 14:27:02 +0000200 OptionalTimePoint deadline,
201 OptionalTimeoutDuration loopTimeoutDuration)
Michael Butlerc2499ec2019-12-11 18:31:12 -0800202 generates (ErrorStatus status, vec<OutputShape> outputShapes,
203 Timing timing);
Miao Wang90cf3dd2019-11-12 14:02:16 -0800204
205 /**
206 * Launch a fenced asynchronous execution on a prepared model.
207 *
208 * The execution is performed asynchronously with respect to the caller.
Miao Wang3fd70b02020-01-21 13:15:09 -0800209 * executeFenced must verify the inputs to the function are correct, and the usages
210 * of memory pools allocated by IDevice::allocate are valid. If there is an error,
211 * executeFenced must immediately return with the corresponding ErrorStatus, an empty
212 * handle for syncFence, and nullptr for callback. If the inputs to the function
213 * are valid and there is no error, executeFenced must dispatch an asynchronous task
214 * to perform the execution in the background, and immediately return with
215 * ErrorStatus::NONE, a sync fence that will be signaled once the execution is completed,
216 * and a callback that can be used by the client to query the duration and runtime error
217 * status. If the task has finished before the call returns, an empty handle may be returned
218 * for syncFence. The execution must wait for all the sync fences (if any) in waitFor
219 * to be signaled before starting the actual execution.
Miao Wang90cf3dd2019-11-12 14:02:16 -0800220 *
221 * When the asynchronous task has finished its execution, it must
Miao Wang3fd70b02020-01-21 13:15:09 -0800222 * immediately signal the syncFence returned from the executeFenced call. After
223 * the syncFence is signaled, the task must not modify the content of
Miao Wang90cf3dd2019-11-12 14:02:16 -0800224 * any data object referenced by 'request' (described by the
225 * {@link @1.0::DataLocation} of a {@link @1.0::RequestArgument}).
226 *
Michael Butler9b9a8042020-02-13 16:37:22 -0800227 * executeFenced may be called with an optional deadline and an optional duration.
Miao Wang3fd70b02020-01-21 13:15:09 -0800228 * If the execution is not able to be completed before the provided deadline or
229 * within the timeout duration (measured from when all sync fences in waitFor are
Michael Butler9b9a8042020-02-13 16:37:22 -0800230 * signaled), whichever comes earlier, the execution may be aborted, and either
Miao Wang3fd70b02020-01-21 13:15:09 -0800231 * {@link ErrorStatus::MISSED_DEADLINE_TRANSIENT} or {@link
Michael Butler9b9a8042020-02-13 16:37:22 -0800232 * ErrorStatus::MISSED_DEADLINE_PERSISTENT} may be returned. The error due
Miao Wang3fd70b02020-01-21 13:15:09 -0800233 * to an abort must be sent the same way as other errors, described above.
Miao Wang3fd70b02020-01-21 13:15:09 -0800234 *
235 * If any of the sync fences in waitFor changes to error status after the executeFenced
236 * call succeeds, or the execution is aborted because it cannot finish before the deadline
237 * has been reached or the duration has elapsed, the driver must immediately set the returned
238 * syncFence to error status.
239 *
Miao Wang90cf3dd2019-11-12 14:02:16 -0800240 * Any number of calls to the executeFenced, execute* and executeSynchronously*
241 * functions, in any combination, may be made concurrently, even on the same
242 * IPreparedModel object.
243 *
244 * @param request The input and output information on which the prepared
Miao Wang3fd70b02020-01-21 13:15:09 -0800245 * model is to be executed. The outputs in the request must have
246 * fully specified dimensions.
Miao Wang90cf3dd2019-11-12 14:02:16 -0800247 * @param waitFor A vector of sync fence file descriptors.
248 * Execution must not start until all sync fences have been signaled.
249 * @param measure Specifies whether or not to measure duration of the execution.
Michael Butler9b9a8042020-02-13 16:37:22 -0800250 * @param deadline The time by which the execution is expected to complete.
251 * If the execution cannot be finished by the deadline, the
252 * execution may be aborted.
Slava Shklyaevf034bf92020-02-11 14:27:02 +0000253 * @param loopTimeoutDuration The maximum amount of time that should be spent
254 * executing a {@link OperationType::WHILE}
255 * operation. If a loop condition model does not
256 * output false within this duration, the
Slava Shklyaev6a222a32020-04-07 13:20:47 +0100257 * execution must be aborted. If no loop timeout
258 * duration is provided, the maximum amount of
259 * time is {@link LoopTimeoutDurationNs::DEFAULT}.
260 * When provided, the duration must not exceed
261 * {@link LoopTimeoutDurationNs::MAXIMUM}.
Michael Butler9b9a8042020-02-13 16:37:22 -0800262 * @param duration The length of time within which the execution is expected
263 * to complete after all sync fences in waitFor are signaled.
264 * If the execution cannot be finished within the duration,
265 * the execution may be aborted.
Miao Wang90cf3dd2019-11-12 14:02:16 -0800266 * @return status Error status of the call, must be:
267 * - NONE if task is successfully launched
268 * - DEVICE_UNAVAILABLE if driver is offline or busy
269 * - GENERAL_FAILURE if there is an unspecified error
270 * - INVALID_ARGUMENT if one of the input arguments is invalid, including
271 * fences in error states.
Michael Butler9b9a8042020-02-13 16:37:22 -0800272 * - MISSED_DEADLINE_* if the execution is aborted because it
273 * cannot be completed by the deadline
Miao Wang3fd70b02020-01-21 13:15:09 -0800274 * - RESOURCE_EXHAUSTED_* if the task was aborted by the
275 * driver
276 * @return syncFence The sync fence that will be signaled when the task is completed.
Miao Wang90cf3dd2019-11-12 14:02:16 -0800277 * The sync fence will be set to error if a critical error,
278 * e.g. hardware failure or kernel panic, occurs when doing execution.
279 * @return callback The IFencedExecutionCallback can be used to query information like duration
280 * and error status when the execution is completed.
281 */
Miao Wang3fd70b02020-01-21 13:15:09 -0800282 executeFenced(Request request, vec<handle> waitFor, MeasureTiming measure,
Slava Shklyaevf034bf92020-02-11 14:27:02 +0000283 OptionalTimePoint deadline, OptionalTimeoutDuration loopTimeoutDuration,
284 OptionalTimeoutDuration duration)
Miao Wang90cf3dd2019-11-12 14:02:16 -0800285 generates (ErrorStatus status, handle syncFence, IFencedExecutionCallback callback);
Xusong Wang62a760c2019-10-25 12:07:17 -0700286};