Kể từ Android 11, NNAPI có 2 thao tác luồng điều khiển, IF
và WHILE
, lấy các mô hình khác làm đối số và thực thi chúng có điều kiện (IF
) hoặc nhiều lần (WHILE
). Điều này cho phép tạo các mô hình thực thi nhiều thao tác dựa trên các giá trị đầu vào hoặc thực thi các thao tác nhiều lần mà không cần mở rộng. Điều này rất quan trọng đối với các trường hợp sử dụng như RNN động và seq2seq.
Trong NN HAL 1.3, mô hình này kết hợp nhiều đồ thị con, bao gồm cả đồ thị con chính được dùng để chỉ định dữ liệu đầu vào và đầu ra của một hoạt động thực thi. Một đồ thị con có thể tham chiếu đến các đồ thị con khác bằng cách sử dụng các toán hạng thuộc loại SUBGRAPH
. Khung này chỉ có thể gửi một thao tác luồng điều khiển đến một trình tăng tốc nếu trình tăng tốc đó hỗ trợ tất cả các thao tác trong tất cả các đồ thị con mà thao tác luồng điều khiển đó tham chiếu.
Giao diện HAL
Trong NN HAL 1.3, các định nghĩa liên quan đến luồng điều khiển nằm trong types.hal
.
IF
vàWHILE
các loại thao tácSUBGRAPH
loại toán hạng vàSUBGRAPH
tương ứng thời gian tồn tại của toán hạngModel
cấu trúc chứa đồ thị con chính và danh sách các đồ thị con được tham chiếuCapabilities
cấu trúc chứaifPerformance
vàwhilePerformance
IDevice.hal
chứa IDevice
, phương thức getSupportedOperations_1_3()
của IDevice
phải xử lý IF
và WHILE
theo cách khác với các thao tác khác.
IPreparedModel.hal
chứa IPreparedModel
, có các phương thức execute_1_3()
, executeSynchronously_1_3()
và executeFenced()
sử dụng đối số loopTimeoutDuration
không bắt buộc.
Triển khai trình điều khiển
Để xem ví dụ về cách triển khai thao tác, hãy xem CpuExecutor::executeIfOperation
và CpuExecutor::executeWhileOperation
.
Để xem logic xác thực thao tác mẫu, hãy xem validateIfOperation()
và validateWhileOperation()
.
Xin lưu ý rằng bạn cần hỗ trợ các phép toán số học và so sánh trên các toán hạng TENSOR_INT32
có hình dạng 1
, vì các toán hạng này có thể được dùng làm bộ đếm vòng lặp.
Tương tự, các thao tác tạo ra toán hạng TENSOR_BOOL8
có hình dạng 1
phải được dùng với các điều kiện IF
và WHILE
.
Hết thời gian chờ thực thi vòng lặp WHILE
Để ngăn chặn vòng lặp vô hạn, quá trình thực thi phải bị huỷ nếu vòng lặp WHILE
mất nhiều thời gian hơn giá trị loopTimeoutDuration
được truyền đến một lệnh gọi IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
hoặc IPreparedModel::executeFenced()
(hoặc giá trị mặc định nếu bị bỏ qua).
Xác nhận kết quả
Các bài kiểm thử luồng điều khiển là một phần của bộ kiểm thử CTS và VTS. Để biết thêm thông tin, hãy xem phần Xác thực.