החל מ-Android 11, NNAPI כולל שתי פעולות של בקרת תהליך, 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
, שה-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. למידע נוסף, ראו אימות.