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 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.

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.