Fluxo de controle

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 criar modelos que executam operações diferentes com base nos valores de entrada ou que executam operações várias vezes sem desenrolar. Isso é importante para casos de uso como RNN dinâmico e seq2seq.

Na NN HAL 1.3, o modelo incorpora vários subgrafos, incluindo o subgrafo principal 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 o acelerador oferecer suporte a 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.

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 um exemplo de lógica de validação de operação, consulte validateIfOperation() e validateWhileOperation().

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

Tempo limite de execução de loop WHILE

Para evitar loops infinitos, a execução precisa ser abortada 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 CTS e VTS. Para mais informações, consulte Validação.