控制流

從 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()

請注意,支持對形狀為1TENSOR_INT32操作數的算術和比較操作很重要,因為它們可以用作循環計數器。同樣,產生形狀為1TENSOR_BOOL8操作數的操作應與IFWHILE條件一起使用。

WHILE 循環執行超時

為了防止無限循環,如果WHILE循環花費的時間比傳遞給loopTimeoutDuration IPreparedModel::execute_1_3()IPreparedModel::executeSynchronously_1_3()IPreparedModel::executeFenced()調用的 loopTimeoutDuration 值長(或默認值),則必須中止執行如果省略)。

驗證

控制流測試是 CTS 和 VTS 測試套件的一部分。有關詳細信息,請參閱驗證