Począwszy od Androida 11, NNAPI zawiera dwie operacje przepływu sterowania, IF
i WHILE
, które przyjmują inne modele jako argumenty i wykonują je warunkowo ( IF
) lub wielokrotnie ( WHILE
). Pozwala to na konstruowanie 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 dynamiczny 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
. Struktura 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 przepływem sterowania znajdują się w types.hal
.
- Typy operacji
IF
iWHILE
- Typ argumentu
SUBGRAPH
i odpowiadający mu czas życia argumentuSUBGRAPH
- Struktura
Model
zawierająca podgraf główny i listę podgrafów, do których się odnoszą - Struktura
Capabilities
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
Aby zapoznać się z przykładową implementacją operacji, zobacz CpuExecutor::executeIfOperation
i CpuExecutor::executeWhileOperation
. Aby zapoznać się z przykładową logiką sprawdzania poprawności operacji, zobacz validateIfOperation()
i validateWhileOperation()
.
Należy pamiętać, że ważne jest wspieranie operacji arytmetycznych i porównawczych na operandach TENSOR_INT32
o kształcie 1
, ponieważ można ich używać jako liczników pętli. Podobnie operacje tworzące argumenty TENSOR_BOOL8
o kształcie 1
powinny być stosowane z warunkami IF
i WHILE
.
Przekroczono limit czasu wykonywania pętli WHILE
Aby zapobiec nieskończonym pętlom, wykonywanie 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 zostanie pominięty).
Walidacja
Testy przepływu sterowania są częścią zestawów testów CTS i VTS. Aby uzyskać więcej informacji, zobacz Walidacja .