Luồng điều khiển

Kể từ Android 11, NNAPI bao gồm hai thao tác kiểm soát luồng, IFWHILE, lấy các mô hình khác làm đối số và thực thi các mô hình đó theo điều kiện (IF) hoặc lặp lại (WHILE). Điều này cho phép tạo các mô hình thực thi nhiều thao tác khác nhau 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 dùng để chỉ định dữ liệu đầu vào và đầu ra của một 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.

IDevice.hal chứa IDevice mà phương thức getSupportedOperations_1_3() phải xử lý IFWHILE 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()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::executeIfOperationCpuExecutor::executeWhileOperation. Để biết logic xác thực thao tác mẫu, hãy xem validateIfOperation()validateWhileOperation().

Xin lưu ý rằng bạn cần hỗ trợ các phép tính số học và so sánh trên 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 phép toán tạo ra toán hạng TENSOR_BOOL8 có hình dạng 1 nên được sử dụng với các điều kiện IFWHILE.

ĐÃ 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 kiểm soát 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.