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

ตั้งแต่ 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 ดูข้อมูลเพิ่มเติมได้ในการตรวจสอบ