Kontrola przepływu

Od Androida 11 interfejs NNAPI zawiera 2 operacje sterowania przepływem: IFWHILE, które przyjmują inne modele jako argumenty i wykonują je warunkowo (IF) lub wielokrotnie (WHILE). Umożliwia to tworzenie modeli, które wykonują różne operacje na podstawie wartości wejściowych lub wykonują operacje wielokrotnie bez rozwijania. Jest to ważne w przypadku zastosowań takich jak dynamiczne sieci RNN i seq2seq.

W NN HAL 1.3 model zawiera wiele 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 odwoływać się do innych podgrafów za pomocą operandów typu SUBGRAPH. Platforma może wysłać operację przepływu sterowania do akceleratora tylko wtedy, gdy akcelerator obsługuje wszystkie operacje we wszystkich podgrafach, do których odwołuje się ta operacja przepływu sterowania.

Interfejsy HAL

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

IDevice.hal zawiera IDevice, którego metoda getSupportedOperations_1_3() musi traktować IFWHILE 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 CpuExecutor::executeIfOperationCpuExecutor::executeWhileOperation. Przykładową logikę weryfikacji operacji znajdziesz w sekcjach validateIfOperation() i validateWhileOperation().

Pamiętaj, że ważne jest, aby obsługiwać operacje arytmetyczne i porównania na TENSOR_INT32operandach o kształcie 1, ponieważ mogą one być używane jako liczniki pętli. Podobnie operacje generujące operandy TENSOR_BOOL8 o kształcie 1 powinny być używane z warunkami IFWHILE.

Limit czasu wykonywania 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 została pominięta).

Weryfikacja

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