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