ควบคุมโฟลว์

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