從 Android 11 開始,NNAPI 包含兩個控制流程作業 IF
和 WHILE
,可將其他模型做為引數,並有條件地 (IF
) 或重複 (WHILE
) 執行這些模型。這項功能可建構模型,根據輸入值執行不同作業,或多次執行作業而不展開。這對動態 RNN 和 seq2seq 等用途來說非常重要。
在 NN HAL 1.3 中,模型會納入多個子圖,包括用於指定執行作業輸入和輸出的主要子圖。子圖可以使用 SUBGRAPH
型別的運算元參照其他子圖。只有當加速器支援控制流程作業所參照的所有子圖中的所有作業時,架構才能將控制流程作業傳送至加速器。
HAL 介面
在 NN HAL 1.3 中,與控制流程相關的定義位於 types.hal
。
IF
和WHILE
作業類型SUBGRAPH
運算元型別和對應的SUBGRAPH
運算元生命週期Model
結構,包含主要子圖 和參照的子圖清單Capabilities
結構,包含ifPerformance
和whilePerformance
IDevice.hal
包含 IDevice
,其方法 getSupportedOperations_1_3()
必須以不同於其他作業的方式處理 IF
和 WHILE
。
IPreparedModel.hal
包含 IPreparedModel
,後者的 execute_1_3()
、executeSynchronously_1_3()
和 executeFenced()
方法會採用選用的 loopTimeoutDuration
引數。
驅動程式實作
如需作業實作範例,請參閱
CpuExecutor::executeIfOperation
和
CpuExecutor::executeWhileOperation
。
如需作業驗證邏輯範例,請參閱 validateIfOperation()
和 validateWhileOperation()
。
請注意,請務必支援對形狀為 1
的 TENSOR_INT32
運算元執行算術和比較運算,因為這些運算元可用做迴圈計數器。同樣地,產生形狀為 1
的 TENSOR_BOOL8
運算元時,應搭配 IF
和 WHILE
條件使用。
WHILE 迴圈執行作業逾時
為避免無限迴圈,如果 WHILE
迴圈的執行時間超過傳遞至 IPreparedModel::execute_1_3()
、IPreparedModel::executeSynchronously_1_3()
或 IPreparedModel::executeFenced()
呼叫的 loopTimeoutDuration
值 (或省略時的預設值),就必須中止執行。
驗證
控制流程測試是 CTS 和 VTS 測試套件的一部分。詳情請參閱「驗證」。