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 yang berbeda berdasarkan nilai input
atau menjalankan operasi beberapa kali tanpa me-unroll. 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. Subgrafik
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
Di NN HAL 1.3, definisi yang terkait dengan alur kontrol berada di
types.hal
.
- Jenis operasi
IF
danWHILE
- Jenis operand
SUBGRAPH
dan masa aktifSUBGRAPH
operand yang sesuai - Struktur
Model
yang berisi subgrafik utama dan daftar subgrafik 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 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
.
Waktu tunggu eksekusi loop WHILE
Untuk mencegah loop tanpa batas, 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.