控制流程

從 Android 11 開始,NNAPI 包含兩個控制流程作業 IFWHILE,可將其他模型做為引數,並以條件式 (IF) 或重複 (WHILE) 方式執行。這可讓您建構模型,根據輸入值執行不同的作業,或在未展開的情況下多次執行作業。這對於動態 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()

請注意,請務必針對 1 形狀的 TENSOR_INT32 運算元支援算術和比較作業,因為這些運算元可做為迴圈計數器。同樣地,產生形狀為 1TENSOR_BOOL8 運算元的運算,應搭配 IFWHILE 條件使用。

WHILE 迴圈執行逾時

為避免無限迴圈,如果 WHILE 迴圈的執行時間超過傳遞至 IPreparedModel::execute_1_3()IPreparedModel::executeSynchronously_1_3()IPreparedModel::executeFenced() 呼叫的 loopTimeoutDuration 值 (或省略時的預設值),則必須中止執行。

驗證

控制流程測試是 CTS 和 VTS 測試套件的一部分。詳情請參閱「驗證」。