ขั้นตอนการควบคุม

เริ่มต้นจาก 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 สำหรับข้อมูลเพิ่มเติม โปรดดูที่ การตรวจสอบความถูกต้อง