Sterowanie przepływem

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 .

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