ควบคุมโฟลว์

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