從 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
循環花費的時間比傳遞給loopTimeoutDuration
IPreparedModel::execute_1_3()
、 IPreparedModel::executeSynchronously_1_3()
或IPreparedModel::executeFenced()
調用的 loopTimeoutDuration 值長(或默認值),則必須中止執行如果省略)。
驗證
控制流測試是 CTS 和 VTS 測試套件的一部分。有關詳細信息,請參閱驗證。