Kontrola przepływu

Począwszy od systemu Android 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ą walidacji operacji, zobacz validateIfOperation() i validateWhileOperation() .

Zauważ, ż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 .

WHILE przekroczenie limitu czasu wykonania pętli

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 pominięto).

Walidacja

Testy przepływu sterowania są częścią zestawów testów CTS i VTS. Aby uzyskać więcej informacji, zobacz Walidacja .