A partire da Android 11, NNAPI include due operazioni di flusso di controllo, IF
e WHILE
, che prendono altri modelli come argomenti e li eseguono in modo condizionale (IF
) o ripetuto (WHILE
). In questo modo è possibile costruire modelli che eseguono operazioni diverse in base ai valori di input o che eseguono operazioni più volte senza annullamento. Questo è importante per i casi d'uso come le 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 del flusso di controllo a un acceleratore solo se quest'ultimo supporta tutte le operazioni in tutti i grafici secondari a cui viene fatto riferimento.
Interfacce HAL
In NN HAL 1.3, le definizioni relative al flusso di controllo si trovano in
types.hal
.
- Tipi di operazioni
IF
eWHILE
SUBGRAPH
tipo di operando e la corrispondenteSUBGRAPH
durata dell'operandoModel
che contiene il sottografo principale e un elenco di sottografi di riferimentoCapabilities
struttura che contieneifPerformance
ewhilePerformance
IDevice.hal
contiene IDevice
, il cui metodo getSupportedOperations_1_3()
deve trattare IF
e WHILE
in modo diverso dalle altre operazioni.
IPreparedModel.hal
contiene IPreparedModel
, i cui metodi execute_1_3()
,
executeSynchronously_1_3()
e executeFenced()
prendono un argomento
loopTimeoutDuration
facoltativo.
Implementazione del driver
Per un'implementazione di esempio dell'operazione, consulta
CpuExecutor::executeIfOperation
e
CpuExecutor::executeWhileOperation
.
Per la logica di convalida delle operazioni di esempio, consulta
validateIfOperation()
e
validateWhileOperation()
.
Tieni presente che è importante supportare operazioni aritmetiche e di confronto sugli
operandi TENSOR_INT32
della forma 1
, poiché possono essere utilizzati come contatori di loop.
Allo stesso modo, le operazioni che producono operandi TENSOR_BOOL8
con forma 1
devono essere utilizzate con le condizioni IF
e WHILE
.
Timeout di esecuzione del loop WHILE
Per evitare cicli infiniti, l'esecuzione deve essere interrotta se un ciclo WHILE
richiede più tempo del valore loopTimeoutDuration
passato a una chiamata di IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
o IPreparedModel::executeFenced()
(o del valore predefinito se omesso).
Convalida
I test di flusso di controllo fanno parte delle suite di test CTS e VTS. Per maggiori informazioni, consulta la sezione Convalida.