Kontrollfluss

Ab Android 11 enthält die NNAPI zwei Kontrollflussvorgänge, IF und WHILE, die andere Modelle als Argumente verwenden und sie bedingt (IF) oder wiederholt (WHILE) ausführen. So können Modelle erstellt werden, die je nach Eingabewerten unterschiedliche Vorgänge ausführen oder Vorgänge mehrmals ohne Entpacken ausführen. Das ist wichtig für Anwendungsfälle wie dynamische RNN und seq2seq.

In NN HAL 1.3 enthält das Modell mehrere Teilgraphen, einschließlich des Hauptteilgraphen, der zum Angeben von Ein- und Ausgaben einer Ausführung verwendet wird. In einem Untergraphen kann mit Operanden vom Typ SUBGRAPH auf andere Untergraphen verwiesen werden. Das Framework kann einen Kontrollflussvorgang nur dann an einen Beschleuniger senden, wenn der Beschleuniger alle Vorgänge in allen Untergraphen unterstützt, auf die sich dieser Kontrollflussvorgang bezieht.

HAL-Schnittstellen

In NN HAL 1.3 befinden sich die Definitionen zum Kontrollfluss in types.hal.

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

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

Treiberimplementierung

Eine Beispielimplementierung für einen Vorgang finden Sie unter CpuExecutor::executeIfOperation und CpuExecutor::executeWhileOperation. Beispiele für die Logik zur Validierung von Vorgängen finden Sie unter validateIfOperation() und validateWhileOperation().

Es ist wichtig, arithmetische und Vergleichsoperationen für TENSOR_INT32-Operanden der Form 1 zu unterstützen, da diese als Schleifenzähler verwendet werden können. Entsprechend sollten Vorgänge, die TENSOR_BOOL8-Operanden der Form 1 erzeugen, mit den Bedingungen IF und WHILE verwendet werden.

Zeitlimit für die Ausführung von WHILE-Schleifen

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

Zertifizierungsstufe

Control Flow-Tests sind Teil der CTS- und VTS-Test-Suites. Weitere Informationen finden Sie unter Validierung.