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