從 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
結構 - 包含
ifPerformance
和whilePerformance
的Capabilities
結構
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 測試套件的一部分。詳情請參閱驗證。