제어 흐름

Android 11부터 NNAPI에는 다른 모델을 인수로 사용하여 조건부( IF ) 또는 반복적으로( WHILE ) 실행하는 두 가지 제어 흐름 작업인 IFWHILE 이 포함됩니다. 이를 통해 입력 값을 기반으로 다른 작업을 실행하거나 언롤링 없이 작업을 여러 번 실행하는 모델을 구성할 수 있습니다. 이는 동적 RNN 및 seq2seq와 같은 사용 사례에 중요합니다.

NN HAL 1.3에서 모델은 실행의 입력 및 출력을 지정하는 데 사용되는 기본 하위 그래프를 포함하여 여러 하위 그래프를 통합합니다. 하위 그래프는 SUBGRAPH 유형의 피연산자를 사용하여 다른 하위 그래프를 참조할 수 있습니다. 프레임워크는 가속기가 제어 흐름 작업에서 참조하는 모든 하위 그래프의 모든 작업을 지원하는 경우에만 제어 흐름 작업을 가속기로 보낼 수 있습니다.

HAL 인터페이스

NN HAL 1.3에서 제어 흐름과 관련된 정의는 types.hal 에 있습니다.

IDevice.hal 에는 getSupportedOperations_1_3() 메서드가 IFWHILE 을 다른 작업과 다르게 처리해야 하는 IDevice 가 포함되어 있습니다.

IPreparedModel.hal 에는 execute_1_3() , IPreparedModel executeSynchronously_1_3()executeFenced() 메서드가 선택적 loopTimeoutDuration 인수를 사용하는 IPreparedModel이 포함되어 있습니다.

드라이버 구현

샘플 작업 구현은 CpuExecutor::executeIfOperationCpuExecutor::executeWhileOperation 을 참조하세요. 샘플 작업 유효성 검사 논리는 validateIfOperation()validateWhileOperation() 을 참조하세요.

모양 1TENSOR_INT32 피연산자에 대한 산술 및 비교 연산을 지원하는 것이 중요합니다. 이러한 피연산자는 루프 카운터로 사용할 수 있기 때문입니다. 마찬가지로 모양 1TENSOR_BOOL8 피연산자를 생성하는 연산은 IFWHILE 조건과 함께 사용해야 합니다.

WHILE 루프 실행 시간 초과

무한 루프를 방지하려면 WHILE 루프가 IPreparedModel::execute_1_3() , IPreparedModel::executeSynchronously_1_3() 또는 IPreparedModel::executeFenced() (또는 기본값)의 호출에 전달된 loopTimeoutDuration 값보다 오래 걸리는 경우 실행을 중단해야 합니다. 생략된 경우).

확인

제어 흐름 테스트는 CTS 및 VTS 테스트 제품군의 일부입니다. 자세한 내용은 유효성 검사 를 참조하십시오.