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

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