Alur kontrol

Mulai dari Android 11, NNAPI menyertakan dua operasi alur kontrol, IF dan WHILE, yang menggunakan model lain sebagai argumen dan mengeksekusinya secara bersyarat (IF) atau berulang kali (WHILE). Hal ini memungkinkan pembuatan model yang mengeksekusi operasi yang berbeda berdasarkan nilai input atau mengeksekusi operasi beberapa kali tanpa membuka. Hal ini penting untuk kasus penggunaan seperti RNN dinamis dan seq2seq.

Di NN HAL 1.3, model ini menggabungkan beberapa subgrafik, termasuk subgrafik utama yang digunakan untuk menentukan input dan output eksekusi. Subgrafik dapat mereferensikan subgrafik lain menggunakan operan jenis SUBGRAPH. Framework dapat mengirim operasi alur kontrol ke akselerator hanya jika akselerator mendukung semua operasi di semua subgraf yang dirujuk oleh operasi alur kontrol tersebut.

Antarmuka HAL

Di NN HAL 1.3, definisi yang terkait dengan alur kontrol ada di types.hal.

IDevice.hal berisi IDevice, yang metode getSupportedOperations_1_3()-nya harus memperlakukan IF dan WHILE secara berbeda dari operasi lainnya.

IPreparedModel.hal berisi IPreparedModel, yang metode execute_1_3(), executeSynchronously_1_3(), dan executeFenced()-nya menggunakan argumen loopTimeoutDuration opsional.

Implementasi driver

Untuk contoh implementasi operasi, lihat CpuExecutor::executeIfOperation dan CpuExecutor::executeWhileOperation. Untuk contoh logika validasi operasi, lihat validateIfOperation() dan validateWhileOperation().

Perhatikan bahwa penting untuk mendukung operasi aritmatika dan perbandingan pada operan TENSOR_INT32 dengan bentuk 1, karena operan ini dapat digunakan sebagai penghitung loop. Demikian pula, operasi yang menghasilkan operan TENSOR_BOOL8 dengan bentuk 1 harus digunakan dengan kondisi IF dan WHILE.

Waktu tunggu eksekusi loop WHILE

Untuk mencegah loop tak terbatas, eksekusi harus dibatalkan jika loop WHILE membutuhkan waktu lebih lama dari nilai loopTimeoutDuration yang diteruskan ke panggilan IPreparedModel::execute_1_3(), IPreparedModel::executeSynchronously_1_3(), atau IPreparedModel::executeFenced() (atau nilai default jika tidak ada).

Validasi

Pengujian alur kontrol adalah bagian dari rangkaian pengujian CTS dan VTS. Untuk mengetahui informasi selengkapnya, lihat Validasi.