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