Kontrola przepływu

Od Androida 11 NNAPI obejmuje 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 przypadkach użycia, takich jak dynamiczne RNN i seq2seq.

W NN HAL 1.3 model zawiera wiele podgrafów, w tym główny podgraf używany 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ę sterowania przepływem do akceleratora tylko wtedy, gdy akcelerator obsługuje wszystkie operacje we wszystkich podgrafach, do których odwołuje się ta operacja sterowania przepływem.

Interfejsy HAL

W NN HAL 1.3 definicje związane ze sterowaniem przepływem znajdują się w types.hal.

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

Implementacja sterownika

Przykładową implementację operacji znajdziesz w plikach CpuExecutor::executeIfOperation i CpuExecutor::executeWhileOperation. Przykładową logikę weryfikacji operacji znajdziesz w plikach validateIfOperation() i validateWhileOperation().

Pamiętaj, że ważne jest, aby obsługiwać operacje arytmetyczne i porównania na operandach TENSOR_INT32 o kształcie 1, ponieważ mogą one być używane jako liczniki pętli. Podobnie operacje tworzą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 IPreparedModel::execute_1_3(), IPreparedModel::executeSynchronously_1_3() lub IPreparedModel::executeFenced() (lub wartość domyślna, jeśli została pominięta).

Weryfikacja

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