Kontrollfluss

Ausgehend von Android 11 umfasst die NNAPI zwei Kontrollflussoperationen, IF und WHILE , dass andere Modelle als Argument und führen sie bedingt ( IF ) oder wiederholt ( WHILE ). Dies ermöglicht das Konstruieren von Modellen, die basierend auf den Eingabewerten verschiedene Operationen ausführen oder Operationen mehrmals ausführen, ohne sie abzurollen. Dies ist wichtig für Anwendungsfälle wie dynamisches RNN und seq2seq.

In NN HAL 1.3 enthält das Modell mehrere Untergraphen, einschließlich des Hauptuntergraphen, der zum Spezifizieren von Eingaben und Ausgaben einer Ausführung verwendet wird. A Subgraphen können andere Subgraphen Referenz Operanden - Typ unter Verwendung von SUBGRAPH . Der Rahmen kann eine Ablaufsteuerungsoperation nur an einen Beschleuniger senden, wenn der Beschleuniger alle Operationen in allen Untergraphen unterstützt, auf die von dieser Ablaufsteuerungsoperation verwiesen wird.

HAL-Schnittstellen

In NN HAL 1.3 sind die Definitionen in Bezug auf Steuerfluss in types.hal .

IDevice.hal enthält IDevice , dessen Methode getSupportedOperations_1_3() muß behandeln IF und WHILE unterschiedlich von anderen Operationen.

IPreparedModel.hal enthält IPreparedModel , deren Methoden execute_1_3() , executeSynchronously_1_3() und executeFenced() nimmt ein optionales loopTimeoutDuration Argument.

Treiberimplementierung

Für eine Probe Betrieb Implementierung finden CpuExecutor::executeIfOperation und CpuExecutor::executeWhileOperation . Für den Probenbetrieb Validierungslogik, siehe validateIfOperation() und validateWhileOperation() .

Beachten Sie, dass es wichtig ist Rechen- und Vergleichsoperationen auf unterstützen TENSOR_INT32 Operanden von Form 1 , da diese als Schleifenzähler verwendet werden können. In ähnlicher Weise Operationen Herstellung TENSOR_BOOL8 Operanden der Form 1 mit verwendet werden sollten IF und WHILE Bedingungen.

Zeitüberschreitung der WHILE-Schleifenausführung

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

Validierung

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