제어 흐름

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

NN HAL 1.3의 모델에는 실행의 입력과 출력을 지정하는 데 사용되는 기본 하위 그래프를 비롯하여 여러 하위 그래프가 포함됩니다. 하위 그래프는 SUBGRAPH 유형의 피연산자를 사용하여 다른 하위 그래프를 참조할 수 있습니다. 프레임워크는 액셀러레이터가 제어 흐름 작업에 참조되는 모든 하위 그래프의 모든 작업을 지원하는 경우에만 제어 흐름 작업을 액셀러레이터로 전송할 수 있습니다.

HAL 인터페이스

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

IDevice.hal에는 IDevice가 포함되어 있습니다. 이 항목의 메서드 getSupportedOperations_1_3()은 다른 연산과는 다르게 IFWHILE을 처리해야 합니다.

IPreparedModel.hal에는 IPreparedModel이 포함되어 있습니다. 이 항목의 메서드 execute_1_3(), executeSynchronously_1_3()executeFenced()는 선택적으로 loopTimeoutDuration 인수를 취합니다.

드라이버 구현

샘플 작업 구현은 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 테스트 제품군의 일부입니다. 자세한 내용은 유효성 검사를 참고하세요.