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
.
IF
- undWHILE
-VorgangstypenSUBGRAPH
Operandentyp und die entsprechendeSUBGRAPH
Lebensdauer des OperandenModel
-Struktur, die den Haupt-Teilgraphen und eine Liste der referenzierten Teilgraphen enthältCapabilities
-Struktur, dieifPerformance
undwhilePerformance
enthält
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.