Flux de contrôle

À partir d'Android 11, NNAPI comprend deux opérations de flux de contrôle, IF et WHILE , qui prennent d'autres modèles comme arguments et les exécutent de manière conditionnelle ( IF ) ou de manière répétée ( WHILE ). Cela permet de construire des modèles qui exécutent différentes opérations en fonction des valeurs d'entrée ou exécutent des opérations plusieurs fois sans déroulement. Ceci est important pour les cas d’utilisation tels que RNN dynamique et seq2seq.

Dans NN HAL 1.3, le modèle intègre plusieurs sous-graphes, y compris le sous-graphe principal utilisé pour spécifier les entrées et les sorties d'une exécution. Un sous-graphe peut référencer d'autres sous-graphes à l'aide d'opérandes de type SUBGRAPH . L'infrastructure peut envoyer une opération de flux de contrôle à un accélérateur uniquement si l'accélérateur prend en charge toutes les opérations dans tous les sous-graphes référencés par cette opération de flux de contrôle.

Interfaces HAL

Dans NN HAL 1.3, les définitions liées au flux de contrôle sont dans types.hal .

IDevice.hal contient IDevice , dont la méthode getSupportedOperations_1_3() doit traiter IF et WHILE différemment des autres opérations.

IPreparedModel.hal contient IPreparedModel , dont les méthodesexecute_1_3 execute_1_3() , executeSynchronously_1_3() executeFenced() prennent un argument loopTimeoutDuration facultatif.

Implémentation du pilote

Pour un exemple d’implémentation d’opération, consultez CpuExecutor::executeIfOperation et CpuExecutor::executeWhileOperation . Pour un exemple de logique de validation d’opération, consultez validateIfOperation() et validateWhileOperation() .

Notez qu'il est important de prendre en charge les opérations arithmétiques et de comparaison sur les opérandes TENSOR_INT32 de forme 1 , car ceux-ci peuvent être utilisés comme compteurs de boucles. De même, les opérations produisant des opérandes TENSOR_BOOL8 de forme 1 doivent être utilisées avec les conditions IF et WHILE .

WHILE délai d'exécution de la boucle

Pour éviter les boucles infinies, l'exécution doit être interrompue si une boucle WHILE prend plus de temps que la valeur loopTimeoutDuration transmise à un appel de IPreparedModel::execute_1_3() , IPreparedModel::executeSynchronously_1_3() ou IPreparedModel::executeFenced() (ou la valeur par défaut si omis).

Validation

Les tests de flux de contrôle font partie des suites de tests CTS et VTS. Pour plus d'informations, voir Validation .