שליטה בתהליך

החל מ-Android 11, ה-NNAPI כולל שתי פעולות בקרה, IF ו-WHILE, שלוקחות מודלים אחרים כארגומנטים ומפעילים אותם באופן מותנה (IF) או שוב ושוב (WHILE). כך אפשר לבנות מודלים שמבצעים פעולות שונות על סמך ערכי הקלט או מבצעות פעולות כמה פעמים בלי גלילה. זה חשוב בתרחישים לדוגמה כמו רשת נוירונים חוזרת דינמית ו-seq2seq.

ב-NN HAL 1.3, המודל כולל כמה תת-תרשיםים, כולל תת-התרשים הראשי שמשמש לציון הקלט והפלט של ביצוע. תת-תרשים יכול להפנות לתת-תרשימים אחרים באמצעות אופרנדים מסוג SUBGRAPH. המסגרת יכולה לשלוח פעולת בקרת זרימה למאיץ רק אם המאיץ תומך בכל הפעולות בכל תת-התרשים שאליו הפעולה הזו מפנה.

ממשקי HAL

ב-NN HAL 1.3, ההגדרות שקשורות לזרימת הבקרה מפורטות במסמך types.hal.

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. מידע נוסף זמין במאמר אימות.