Flusso di controllo

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.

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.