Alur kontrol

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

Dalam NN HAL 1.3, model ini menggabungkan beberapa subgrafik, termasuk subgrafik utama yang digunakan untuk menentukan input dan output eksekusi. Sub grafik dapat mereferensikan subgrafik lain menggunakan operand jenis SUBGRAPH. Framework ini dapat mengirimkan operasi alur kontrol ke akselerator hanya jika akselerator mendukung semua operasi di semua subgrafik yang direferensikan oleh operasi alur kontrol tersebut.

Antarmuka HAL

Pada NN HAL 1.3, definisi terkait alur kontrol ada di types.hal.

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

IPreparedModel.hal berisi IPreparedModel, yang metodenya execute_1_3(), executeSynchronously_1_3(), dan executeFenced() mengambil 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 aritmetika dan perbandingan pada Operand TENSOR_INT32 dengan bentuk 1, karena ini dapat digunakan sebagai penghitung loop. Demikian pula, operasi yang menghasilkan operand TENSOR_BOOL8 bentuk 1 harus digunakan dengan kondisi IF dan WHILE.

Waktu tunggu eksekusi loop WHILE habis

Untuk mencegah loop tanpa henti, eksekusi harus dibatalkan jika loop WHILE memerlukan 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 dihilangkan).

Validasi

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