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