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 wycofywania. Jest to ważne w przypadkach użycia takich jak dynamiczne RNN czy seq2seq.
W NN HAL 1.3 model zawiera wiele podgrafów, w tym podgrafu głównego, 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ć do akceleratora operację przepływu sterującego tylko wtedy, gdy akcelerator obsługuje wszystkie operacje we wszystkich podgrafach, do których odwołuje się ta operacja przepływu kontrolnego.
Interfejsy HAL
W NN HAL 1.3 definicje związane z przepływem sterującym znajdują się w types.hal
.
- Typy operacji
IF
iWHILE
- Typ argumentu
SUBGRAPH
i odpowiedni czas trwania argumentuSUBGRAPH
- Struktura
Model
zawierająca podgraf i listę przywoływanych podgrafów Capabilities
, która zawieraifPerformance
orazwhilePerformance
IDevice.hal
zawiera IDevice
, której 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 sterowników
Przykładową implementację operacji znajdziesz w sekcjach CpuExecutor::executeIfOperation
i CpuExecutor::executeWhileOperation
.
Przykładową logikę weryfikacji operacji znajdziesz w sekcjach validateIfOperation()
i validateWhileOperation()
.
Uwaga: obsługa operacji arytmetycznych i porównawczych na operandach kształtu TENSOR_INT32
o kształcie 1
jest ważna, 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 zapętleniu nieskończonym, należy przerwać wykonywanie, jeśli pętla WHILE
trwa dłużej niż wartość loopTimeoutDuration
przekazana do wywołania IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
lub IPreparedModel::executeFenced()
(albo do wartości domyślnej w przypadku jej pominięcia).
Weryfikacja
Testy przepływu kontrolnego są częścią zestawów testów CTS i VTS. Więcej informacji znajdziesz w sekcji Weryfikacja.