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