Ab Android 11 umfasst die NNAPI zwei Ablaufsteuerungsvorgänge, IF
und WHILE
, die andere Modelle als Argumente verwenden und sie bedingt (IF
) oder wiederholt (WHILE
) ausführen. Auf diese Weise können Modelle erstellt werden, die verschiedene Vorgänge basierend auf den Eingabewerten ausführen oder Vorgänge mehrmals ausführen, ohne einen Rollback auszuführen. Das ist wichtig für Anwendungsfälle wie dynamisches RNN und seq2seq.
In NN HAL 1.3 umfasst das Modell mehrere Teildiagramme, einschließlich des Hauptuntergraphen, der zum Festlegen von Ein- und Ausgaben einer Ausführung verwendet wird. Ein Teilgraph kann mithilfe von Operanden des Typs SUBGRAPH
auf andere Teildiagramme verweisen. Das Framework kann nur dann einen Vorgang zur Ablaufsteuerung an einen Beschleuniger senden, wenn der Beschleuniger alle Vorgänge in allen Teilgraphen unterstützt, auf die dieser Vorgang zur Steuerung des Ablaufs verweist.
HAL-Schnittstellen
In NN HAL 1.3 finden Sie die Definitionen für die Ablaufsteuerung in types.hal
.
IF
- undWHILE
-VorgangstypenSUBGRAPH
-Operandentyp und die entsprechendeSUBGRAPH
-OperandenlebensdauerModel
-Struktur, die den Hauptdiagramm und eine Liste referenzierter Untergraphen enthältCapabilities
-Struktur, dieifPerformance
undwhilePerformance
enthält
IDevice.hal
enthält IDevice
, deren Methode getSupportedOperations_1_3()
IF
und WHILE
anders behandeln muss als andere Vorgänge.
IPreparedModel.hal
enthält IPreparedModel
, für deren Methoden execute_1_3()
, executeSynchronously_1_3()
und executeFenced()
ein optionales Argument loopTimeoutDuration
verwenden.
Treiberimplementierung
Ein Beispiel für die Implementierung eines Vorgangs finden Sie unter CpuExecutor::executeIfOperation
und CpuExecutor::executeWhileOperation
.
Eine Beispiellogik für die Validierung von Vorgängen finden Sie unter validateIfOperation()
und validateWhileOperation()
.
Es ist wichtig, arithmetische und Vergleichsvorgänge für TENSOR_INT32
-Operanden der Form 1
zu unterstützen, da diese als Schleifenzähler verwendet werden können.
Ebenso sollten Vorgänge, die TENSOR_BOOL8
-Operanden der Form 1
erzeugen, mit den Bedingungen IF
und WHILE
verwendet werden.
Zeitlimit für WHILE-Schleifenausführung
Zum Verhindern von Endlosschleifen muss die Ausführung abgebrochen werden, wenn eine WHILE
-Schleife länger dauert als der loopTimeoutDuration
-Wert, der an einen Aufruf von IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
oder IPreparedModel::executeFenced()
übergeben wird (oder den Standardwert, falls dieser weggelassen wird).
Zertifizierungsstufe
Kontrollflusstests sind Teil der CTS- und VTS-Testsuites. Weitere Informationen finden Sie unter Validierung.