Flusso di controllo

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.

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.