Od Androida 11 interfejs NNAPI zawiera 2 operacje sterowania przepływem: IF i WHILE, 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.
- IForaz- WHILEtypy operacji.
- SUBGRAPHtyp argumentu operacji i odpowiadający mu- SUBGRAPHokres istnienia argumentu operacji;
- Modelstruktura zawierająca główny podgraf i listę podgrafów, do których się odwołuje.
- Capabilitiesstruktura zawierająca- ifPerformancei- whilePerformance
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() i executeFenced() przyjmują opcjonalny argument loopTimeoutDuration.
Implementacja sterownika
Przykładową implementację operacji znajdziesz w CpuExecutor::executeIfOperation i CpuExecutor::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 IF i WHILE.
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.
