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
). Ciò consente di costruire modelli che eseguono operazioni diverse in base ai valori di input o 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 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
.
IF
eWHILE
tipi di operazioniSUBGRAPH
tipo di operando e la corrispondenteSUBGRAPH
durata dell'operando- Struttura
Model
che contiene il sottografo principale e un elenco di sottografi a cui viene fatto riferimento - Struttura
Capabilities
contenenteifPerformance
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()
accettano un argomento facoltativo
loopTimeoutDuration
.
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 le operazioni aritmetiche e di confronto su
operandi TENSOR_INT32
di forma 1
, in quanto possono essere utilizzati come contatori di loop.
Analogamente, le operazioni che producono operandi TENSOR_BOOL8
di forma 1
devono essere impiegate 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 ulteriori informazioni, consulta la sezione Convalida.