A partir do Android 11, a NNAPI inclui duas operações de fluxo de controle, IF
e WHILE
, que usam outros modelos como argumentos e os executam condicionalmente (IF
) ou repetidamente (WHILE
). Isso permite construir modelos que executam diferentes operações com base nos valores de entrada ou executam operações várias vezes sem desenrolar. Isso é importante para casos de uso como RNN dinâmica e seq2seq.
Na NN HAL 1.3, o modelo incorpora vários subgrafos, incluindo o principal, que é usado para especificar entradas e saídas de uma execução. Um subgrafo pode referenciar outros subgrafos usando operandos do tipo SUBGRAPH
. O
framework só pode enviar uma operação de fluxo de controle para um acelerador se ele for compatível com todas as operações em todos os subgrafos referenciados por essa operação de fluxo de controle.
Interfaces HAL
No NN HAL 1.3, as definições relacionadas ao fluxo de controle estão em
types.hal
.
IF
eWHILE
tipos de operaçãoSUBGRAPH
tipo de operando e aSUBGRAPH
vida útil correspondente do operandoModel
estrutura que contém o subgrafo principal e uma lista de subgrafos referenciadosCapabilities
estrutura que contémifPerformance
ewhilePerformance
IDevice.hal
contém IDevice
, cujo método getSupportedOperations_1_3()
precisa tratar IF
e WHILE
de maneira diferente de outras operações.
IPreparedModel.hal
contém IPreparedModel
, cujos métodos execute_1_3()
,
executeSynchronously_1_3()
e executeFenced()
usam um argumento
loopTimeoutDuration
opcional.
Implementação de drivers
Para ver um exemplo de implementação de operação, consulte
CpuExecutor::executeIfOperation
e
CpuExecutor::executeWhileOperation
.
Para ver uma amostra da lógica de validação de operações, consulte
validateIfOperation()
e
validateWhileOperation()
.
É importante oferecer suporte a operações aritméticas e de comparação em operandos TENSOR_INT32
de forma 1
, já que eles podem ser usados como contadores de loop.
Da mesma forma, operações que produzem operandos TENSOR_BOOL8
de formato 1
precisam ser usadas com condições IF
e WHILE
.
Tempo limite de execução do loop WHILE
Para evitar loops infinitos, a execução precisa ser interrompida se um loop WHILE
levar mais tempo do que o valor loopTimeoutDuration
transmitido para uma chamada de IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
ou IPreparedModel::executeFenced()
(ou o valor padrão, se omitido).
Validação
Os testes de fluxo de controle fazem parte dos conjuntos de testes do CTS e do VTS. Para mais informações, consulte Validação.