החל מ-Android 11, ה-NNAPI כולל שתי פעולות בקרה, IF
ו-WHILE
, שלוקחות מודלים אחרים כארגומנטים ומפעילים אותם באופן מותנה (IF
) או שוב ושוב (WHILE
). כך אפשר לבנות מודלים שמבצעים פעולות שונות על סמך ערכי הקלט או מבצעות פעולות כמה פעמים בלי גלילה. זה חשוב בתרחישים לדוגמה כמו רשת נוירונים חוזרת דינמית ו-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
, שה-methods שלו, execute_1_3()
, executeSynchronously_1_3()
ו-executeFenced()
, מקבלים ארגומנט loopTimeoutDuration
אופציונלי.
הטמעת מנהל
דוגמה להטמעת פעולה מפורטת במאמרים CpuExecutor::executeIfOperation
ו-CpuExecutor::executeWhileOperation
.
ללוגיקה לדוגמה של אימות פעולות, ראו validateIfOperation()
ו-validateWhileOperation()
.
חשוב לזכור שחשוב לתמוך בפעולות חישוביות ובפעולות השוואה על אופרטורים של TENSOR_INT32
בפורמט 1
, כי אפשר להשתמש בהם כמספרים של לולאות.
באופן דומה, צריך להשתמש בתנאי IF
ו-WHILE
בפעולות שמניבות אופרטורים מסוג TENSOR_BOOL8
בפורמט 1
.
זמן קצוב לתפוגה של ביצוע לולאת WHILE
כדי למנוע לולאות אינסופיות, צריך לבטל את ההפעלה אם לולאה של WHILE
לוקחת יותר זמן מהערך loopTimeoutDuration
שמועבר לקריאה של IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
או IPreparedModel::executeFenced()
(או ערך ברירת המחדל אם לא צוין).
אימות
בדיקות של תהליך הבקרה הן חלק מחבילות הבדיקות של CTS ו-VTS. מידע נוסף זמין במאמר אימות.