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
.
IF
danWHILE
jenis operasiSUBGRAPH
jenis operand danSUBGRAPH
masa pakai operand yang sesuaiModel
struktur yang berisi subgraf utama dan daftar subgraf yang dirujuk- Struktur
Capabilities
yang berisiifPerformance
danwhilePerformance
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.