Sterowanie przepływem

Począwszy od Androida 11 interfejs NNAPI obejmuje 2 operacje przepływu sterującego, IF i WHILE, które przyjmują inne modele jako argumenty i wykonują je warunkowo (IF) lub wielokrotnie (WHILE). Umożliwia to konstruowanie modeli, które wykonują różne operacje na podstawie wartości wejściowych lub wykonują operacje wiele razy bez wywijania. Jest to ważne w przypadkach użycia takich jak dynamiczne RNN czy seq2seq.

W NN HAL 1.3 model zawiera kilka podgrafów, w tym główny podgraf, który służy do określania danych wejściowych i wyjściowych wykonania. Podgraf może się odwoływać do innych podgrafów za pomocą operandów typu SUBGRAPH. Framework może wysłać operację sterowania do akceleratora tylko wtedy, gdy akcelerator obsługuje wszystkie operacje we wszystkich podgrafach, do których odwołuje się ta operacja sterowania.

Interfejsy HAL

W NN HAL 1.3 definicje związane z kontrolą przepływu znajdują się w types.hal.

IDevice.hal zawiera IDevice, którego metoda getSupportedOperations_1_3() musi traktować IF i WHILE inaczej niż inne operacje.

IPreparedModel.hal zawiera IPreparedModel, którego metody execute_1_3(), executeSynchronously_1_3()executeFenced() przyjmują opcjonalny argument loopTimeoutDuration.

Implementacja sterownika

Przykładową implementację operacji znajdziesz w artykule CpuExecutor::executeIfOperationCpuExecutor::executeWhileOperation. Przykładową logikę weryfikacji operacji znajdziesz w artykule validateIfOperation()validateWhileOperation().

Pamiętaj, że ważne jest, aby obsługiwać operacje arytmetyczne i porównawcze na operandach TENSOR_INT32 o postaci 1, ponieważ można ich używać jako liczników pętli. Podobnie operacji generujących operandy TENSOR_BOOL8 o kształcie 1 należy używać z warunkami IF i WHILE.

Czas oczekiwania na wykonanie pętli WHILE

Aby zapobiec nieskończonym pętlom, wykonanie musi zostać przerwane, jeśli pętla WHILE trwa dłużej niż wartość loopTimeoutDuration przekazana do wywołania funkcji IPreparedModel::execute_1_3(), IPreparedModel::executeSynchronously_1_3() lub IPreparedModel::executeFenced() (lub wartość domyślna, jeśli nie została podana).

Weryfikacja

Testy przepływu sterowania są częścią zestawów testów CTS i VTS. Więcej informacji znajdziesz w sekcji Weryfikacja.