Mulai 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 menjalankan operasi beberapa kali tanpa menguraikannya. Hal ini penting untuk kasus penggunaan seperti RNN dinamis dan seq2seq.
Di NN HAL 1.3, model menggabungkan beberapa subgrafik, termasuk subgrafik utama yang digunakan untuk menentukan input dan output eksekusi. Subgrafik dapat mereferensikan subgrafik lain menggunakan operand berjenis SUBGRAPH. Framework hanya dapat mengirim operasi alur kontrol ke akselerator jika akselerator mendukung semua operasi di semua subgrafik yang direferensikan oleh operasi alur kontrol tersebut.
Antarmuka HAL
Di NN HAL 1.3, definisi yang terkait dengan alur kontrol ada di
types.hal.
IFdanWHILEjenis operasiSUBGRAPHjenis operand dan masa aktif operandSUBGRAPHyang sesuaiModelstruktur yang berisi subgrafik utama dan daftar subgrafik yang direferensikanCapabilitiesstruktur yang berisiifPerformancedanwhilePerformance
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() 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 aritmetika dan perbandingan pada operand TENSOR_INT32 dengan bentuk 1, karena dapat digunakan sebagai penghitung loop.
Demikian pula, operasi yang menghasilkan operand TENSOR_BOOL8 dengan bentuk 1 harus digunakan dengan kondisi IF dan WHILE.
Batas waktu eksekusi loop WHILE
Untuk mencegah loop tak terbatas, 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
Pengujian alur kontrol adalah bagian dari rangkaian pengujian CTS dan VTS. Untuk mengetahui informasi selengkapnya, lihat Validasi.