A partire da Android 11, NNAPI include due operazioni di flusso di controllo, IF e WHILE, che accettano altri modelli come argomenti e li eseguono in modo condizionale (IF) o ripetutamente (WHILE). In questo modo è possibile creare modelli che eseguono operazioni diverse in base ai valori di input o eseguono operazioni più volte senza espansione. Questo è importante per casi d'uso come RNN dinamiche e seq2seq.
In NN HAL 1.3, il modello incorpora più sottografi, incluso il sottografo principale utilizzato per specificare gli input e gli output di un'esecuzione. Un sottografo può fare riferimento ad altri sottografi utilizzando operandi di tipo SUBGRAPH. Il framework può inviare un'operazione di flusso di controllo a un acceleratore solo se l'acceleratore supporta tutte le operazioni in tutti i sottografi a cui fa riferimento l'operazione di flusso di controllo.
Interfacce HAL
In NN HAL 1.3, le definizioni relative al flusso di controllo si trovano in
types.hal.
IFeWHILEtipi di operazioniSUBGRAPHtipo di operando e la durata dell'operando corrispondenteSUBGRAPHModelstruttura che contiene il sottografo principale e un elenco di sottografi a cui viene fatto riferimentoCapabilitiesstruttura che contieneifPerformanceewhilePerformance
IDevice.hal
contiene IDevice, il cui metodo getSupportedOperations_1_3() deve trattare IF
e WHILE in modo diverso rispetto ad altre operazioni.
IPreparedModel.hal
contiene IPreparedModel, i cui metodi execute_1_3(),
executeSynchronously_1_3() e executeFenced() accettano un argomento
loopTimeoutDuration facoltativo.
Implementazione del driver
Per un'implementazione di un'operazione di esempio, consulta
CpuExecutor::executeIfOperation
e
CpuExecutor::executeWhileOperation.
Per la logica di convalida delle operazioni di esempio, consulta
validateIfOperation()
e
validateWhileOperation().
Tieni presente che è importante supportare le operazioni aritmetiche e di confronto sugli operandi TENSOR_INT32 di forma 1, in quanto possono essere utilizzati come contatori di loop.
Allo stesso modo, le operazioni che producono operandi TENSOR_BOOL8 di forma 1 devono essere utilizzate con le condizioni IF e WHILE.
Timeout di esecuzione del loop WHILE
Per evitare loop infiniti, l'esecuzione deve essere interrotta se un loop WHILE richiede più tempo del valore loopTimeoutDuration passato a una chiamata di IPreparedModel::execute_1_3(), IPreparedModel::executeSynchronously_1_3() o IPreparedModel::executeFenced() (o il valore predefinito se omesso).
Convalida
I test del flusso di controllo fanno parte delle suite di test CTS e VTS. Per saperne di più, consulta Convalida.