Kontrola przepływu

Od Androida 11 NNAPI zawiera 2 operacje sterowania przepływem danych, IFWHILE, 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 kilka 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 się odwoływać do innych podgrafów za pomocą operandów typu SUBGRAPH. Framework może wysłać operację sterowania do akceleratora tylko wtedy, gdy akcelerator obsługuje wszystkie operacje we wszystkich podgrafach, do których odwołuje się ta operacja sterowania.

Interfejsy HAL

W NN HAL 1.3 definicje związane z przepływem sterowania 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()executeFenced() przyjmują opcjonalny argument loopTimeoutDuration.

Implementacja sterownika

Przykładową implementację operacji znajdziesz w artykule CpuExecutor::executeIfOperationCpuExecutor::executeWhileOperation. Przykładową logikę walidacji operacji znajdziesz w artykule validateIfOperation()validateWhileOperation().

Pamiętaj, że ważne jest, aby obsługiwać operacje arytmetyczne i porównawcze na operandach TENSOR_INT32 o postaci 1, ponieważ można ich używać jako liczników pętli. Podobnie operacje zwracające operandy TENSOR_BOOL8 o kształcie 1 powinny być używane z warunkami IFWHILE.

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 nie podano innej).

Weryfikacja

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