เริ่มต้นจาก Android 11 NNAPI มีการดำเนินการควบคุมโฟลว์สองรายการ IF
และ WHILE
ที่ใช้โมเดลอื่นเป็นอาร์กิวเมนต์และดำเนินการตามเงื่อนไข ( IF
) หรือซ้ำ ๆ ( WHILE
) ซึ่งช่วยให้สามารถสร้างแบบจำลองที่ดำเนินการที่แตกต่างกันตามค่าอินพุตหรือดำเนินการหลายครั้งโดยไม่ต้องคลายออก นี่เป็นสิ่งสำคัญสำหรับกรณีการใช้งาน เช่น Dynamic 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()
โปรดทราบว่าการสนับสนุนการดำเนินการทางคณิตศาสตร์และการเปรียบเทียบในตัวถูกดำเนินการ TENSOR_INT32
ของรูปร่าง 1
เป็นสิ่งสำคัญ เนื่องจากสิ่งเหล่านี้สามารถใช้เป็นตัวนับลูปได้ ในทำนองเดียวกัน การดำเนินการที่สร้างตัวถูกดำเนินการ TENSOR_BOOL8
รูปร่าง 1
ควรใช้กับเงื่อนไข IF
และ WHILE
WHILE หมดเวลาดำเนินการวนซ้ำ
เพื่อป้องกันการวนซ้ำแบบไม่มีที่สิ้นสุด การดำเนินการจะต้องถูกยกเลิกหากการวนซ้ำ WHILE
ใช้เวลานานกว่าค่า loopTimeoutDuration
ที่ส่งไปยังการเรียกของ IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
หรือ IPreparedModel::executeFenced()
(หรือค่าเริ่มต้น หากละเว้น)
การตรวจสอบ
การทดสอบการไหลควบคุมเป็นส่วนหนึ่งของชุดการทดสอบ CTS และ VTS สำหรับข้อมูลเพิ่มเติม โปรดดูที่ การตรวจสอบความถูกต้อง