Bắt đầu từ Android 11, NNAPI bao gồm hai 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 theo điều kiện ( IF
) hoặc lặp đi lặp lại ( WHILE
). Điều này cho phép xây dựng các mô hình thực hiện các hoạt động khác nhau dựa trên các giá trị đầu vào hoặc thực hiện các hoạt động nhiều lần mà không cần hủy đăng ký. Đ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 kết hợp nhiều biểu đồ con, bao gồm cả biểu đồ con chính được sử dụng để chỉ định đầu vào và đầu ra của quá trình thực thi. Một sơ đồ con có thể tham chiếu các sơ đồ con khác bằng cách sử dụng các toán hạng thuộc loại SUBGRAPH
. Khung chỉ có thể gửi một hoạt động luồng điều khiển tới một bộ tăng tốc nếu bộ tăng tốc hỗ trợ tất cả các hoạt động trong tất cả các sơ đồ con được tham chiếu bởi hoạt động 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ó trong types.hal
.
- Các kiểu hoạt động
IF
vàWHILE
- Loại toán hạng
SUBGRAPH
và thời gian tồn tại củaSUBGRAPH
tương ứng - Cấu trúc
Model
chứa sơ đồ con chính và danh sách các sơ đồ con được tham chiếu - Cấu trúc
Capabilities
chứaifPerformance
vàwhilePerformance
IDevice.hal
chứa IDevice
, có phương thức getSupportedOperations_1_3()
phải xử lý IF
và WHILE
khác với các hoạt động 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
tùy chọn.
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()
.
Lưu ý rằng điều quan trọng là phải 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ì chúng có thể được sử dụng làm bộ đếm vòng lặp. Tương tự, nên sử dụng các phép toán tạo ra toán hạng TENSOR_BOOL8
có hình dạng 1
với điều kiện IF
và WHILE
.
Hết thời gian thực hiện vòng lặp WHILE
Để ngăn vòng lặp vô hạn, việc thực thi phải bị hủy bỏ nếu vòng lặp WHILE
mất nhiều thời gian hơn giá trị loopTimeoutDuration
được truyền cho 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ỏ qua).
Thẩm định
Kiểm tra luồng điều khiển là một phần của bộ kiểm tra CTS và VTS. Để biết thêm thông tin, hãy xem Xác thực .