החל מ-Android 11, ה-NNAPI כולל שתי פעולות בקרה, IF
ו-WHILE
, שלוקחות מודלים אחרים כארגומנטים ומפעילים אותם באופן מותנה (IF
) או שוב ושוב (WHILE
). כך אפשר לבנות מודלים שמבצעים פעולות שונות על סמך ערכי הקלט או מבצעות פעולות כמה פעמים בלי גלילה. זה חשוב בתרחישים לדוגמה כמו רשת נוירונים חוזרת דינמית ו-seq2seq.
ב-NN HAL 1.3, המודל משלב מספר תתי-תרשימים, כולל תת-התרשים הראשי שמשמש לציון מקורות הקלט והפלט של ביצוע. תיאור המשנה יכול להפנות לתת-תרשימים אחרים באמצעות אופרנדים מסוג SUBGRAPH
. ה-framework יכול לשלוח פעולה בתהליך בקרה למאיץ רק אם המאיץ תומך בכל הפעולות בכל תתי-הספרות שאליו מפנה הפעולה של תהליך הבקרה.
ממשקי 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
, כי אפשר להשתמש בהם כמוני לולאה.
באופן דומה, צריך להשתמש בפעולות שמייצרות אופרנדים של TENSOR_BOOL8
בצורה 1
עם התנאים IF
ו-WHILE
.
זמן קצוב לתפוגה של ביצוע לולאה ב-WHILE
כדי למנוע לולאות אינסופיות, צריך לבטל את ההפעלה אם לולאה של WHILE
לוקחת יותר זמן מהערך loopTimeoutDuration
שמועבר לקריאה של IPreparedModel::execute_1_3()
, IPreparedModel::executeSynchronously_1_3()
או IPreparedModel::executeFenced()
(או ערך ברירת המחדל אם לא צוין).
אימות
בדיקות זרימה בקרה הן חלק מחבילות הבדיקות של CTS ו-VTS. מידע נוסף זמין במאמר אימות.