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
.
IF
orazWHILE
typy operacji.SUBGRAPH
typ argumentu operacji i odpowiadający muSUBGRAPH
okres istnienia argumentu operacji;Model
struktura zawierająca główny podgraf i listę podgrafów, do których się odwołuje.Capabilities
struktura zawierającaifPerformance
iwhilePerformance
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_INT32
operandach 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.