Fluxo de controle

No Android 11 e versões mais recentes, 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 a construção de 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 subgráficos, incluindo o subgráfico principal, usado para especificar entradas e saídas de uma execução. Um subgráfico pode referenciar outros subgráficos usando operandos do tipo SUBGRAPH. O framework só poderá enviar uma operação de fluxo de controle a um acelerador se ele for compatível com todas as operações em todos os subgráficos referenciados por essa operação de fluxo de controle.

Interfaces HAL

Na NN HAL 1.3, as definições relacionadas ao fluxo de controle estão em types.hal.

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 do driver

Para conferir um exemplo de implementação de operação, consulte CpuExecutor::executeIfOperation e CpuExecutor::executeWhileOperation. Para conferir a lógica de validação da operação de amostra, consulte validateIfOperation() e validateWhileOperation().

É importante oferecer suporte a operações aritméticas e de comparação nos operandos TENSOR_INT32 na forma 1, já que eles podem ser usados como contadores de loop. Da mesma forma, as operações que produzem operandos TENSOR_BOOL8 na forma 1 precisam ser usadas com as condições IF e WHILE.

Tempo limite de execução do loop WHILE

Para evitar repetições infinitas, a execução precisará ser abortada se uma repetição WHILE demorar mais 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 CTS e VTS. Para mais informações, consulte Validação.