Ablaufsteuerung

Ab Android 11 umfasst die NNAPI zwei Kontrollflussoperationen, IF und WHILE , die andere Modelle als Argumente verwenden und diese bedingt ( IF ) oder wiederholt ( WHILE ) ausführen. Dies ermöglicht die Konstruktion von Modellen, die basierend auf den Eingabewerten unterschiedliche Operationen ausführen oder Operationen mehrmals ausführen, ohne sie abzuwickeln. Dies ist wichtig für Anwendungsfälle wie dynamisches RNN und seq2seq.

In NN HAL 1.3 umfasst das Modell mehrere Untergraphen, einschließlich des Hauptuntergraphen, der zum Spezifizieren von Eingaben und Ausgaben einer Ausführung verwendet wird. Ein Untergraph kann mithilfe von Operanden vom Typ SUBGRAPH auf andere Untergraphen verweisen. Das Framework kann eine Kontrollflussoperation nur dann an einen Beschleuniger senden, wenn der Beschleuniger alle Operationen in allen Untergraphen unterstützt, auf die diese Kontrollflussoperation verweist.

HAL-Schnittstellen

In NN HAL 1.3 befinden sich die Definitionen im Zusammenhang mit dem Kontrollfluss in types.hal .

IDevice.hal enthält IDevice , dessen Methode getSupportedOperations_1_3() IF und WHILE anders behandeln muss als andere Operationen.

IPreparedModel.hal enthält IPreparedModel , dessen Methoden execute_1_3() , executeSynchronously_1_3() und executeFenced() ein optionales Argument „ loopTimeoutDuration annehmen.

Treiberimplementierung

Eine Beispieloperationsimplementierung finden Sie unter CpuExecutor::executeIfOperation und CpuExecutor::executeWhileOperation . Eine Beispiellogik für die Operationsvalidierung finden Sie unter validateIfOperation() und validateWhileOperation() .

Beachten Sie, dass es wichtig ist, Rechen- und Vergleichsoperationen für TENSOR_INT32 Operanden der Form 1 zu unterstützen, da diese als Schleifenzähler verwendet werden können. Ebenso sollten Operationen, TENSOR_BOOL8 Operanden der Form 1 erzeugen, mit IF und WHILE -Bedingungen verwendet werden.

Zeitüberschreitung bei der Ausführung der WHILE-Schleife

Um Endlosschleifen zu verhindern, muss die Ausführung abgebrochen werden, wenn eine WHILE Schleife länger dauert als der Wert loopTimeoutDuration , der an einen Aufruf von IPreparedModel::execute_1_3() , IPreparedModel::executeSynchronously_1_3() oder IPreparedModel::executeFenced() (oder den Standardwert) übergeben wird falls weggelassen).

Validierung

Kontrollflusstests sind Teil der CTS- und VTS-Testsuiten. Weitere Informationen finden Sie unter Validierung .