控制流程

從 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循環花費的時間長於傳遞給IPreparedModel::execute_1_3()IPreparedModel::executeSynchronously_1_3() loopTimeoutDuration IPreparedModel::executeFenced()值(或稱預設值),則必須中止執行如果預設值),則必須中止執行如果省略)。

驗證

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