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