ตั้งแต่ Android 11 เป็นต้นไป NNAPI ประกอบด้วยการดำเนินการโฟลว์การควบคุม 2 รายการ คือ IF
และ WHILE
ที่นำโมเดลอื่นเป็นอาร์กิวเมนต์และดำเนินการอย่างมีเงื่อนไข (IF
) หรือซ้ำๆ (WHILE
) เพื่อสร้างโมเดลที่ดำเนินการต่างๆ ตามค่าอินพุต หรือดำเนินการหลายๆ ครั้งโดยไม่ต้องยกเลิกการย้อนกลับ ซึ่งสำคัญสำหรับ Use Case เช่น RNN แบบไดนามิกและ seq2seq
ใน NN HAL 1.3 โมเดลนี้จะรวมรายละเอียดย่อยหลายรายการ รวมถึงกราฟย่อยหลักที่ใช้สำหรับระบุอินพุตและเอาต์พุตของการดำเนินการ กราฟย่อยสามารถอ้างอิงกราฟย่อยอื่นๆ โดยใช้ตัวถูกดำเนินการของประเภท SUBGRAPH
เฟรมเวิร์กจะส่งการดำเนินการโฟลว์การควบคุมไปยัง Accelerator ได้ต่อเมื่อ Accelerator รองรับการดำเนินการทั้งหมดในกราฟย่อยทั้งหมดที่อ้างอิงโดยการดำเนินการโฟลว์การควบคุมดังกล่าว
อินเทอร์เฟซ 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 ดูข้อมูลเพิ่มเติมได้ในการตรวจสอบ