שליטה בתהליך

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

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

ממשקי 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, כי אפשר להשתמש בהם כמוני לולאה. באופן דומה, צריך להשתמש בפעולות שמייצרות אופרנדים של TENSOR_BOOL8 בצורה 1 עם התנאים IF ו-WHILE.

זמן קצוב לתפוגה של ביצוע לולאה ב-WHILE

כדי למנוע לולאות אינסופיות, צריך לבטל את ההפעלה אם לולאה של WHILE לוקחת יותר זמן מהערך loopTimeoutDuration שמועבר לקריאה של IPreparedModel::execute_1_3(), IPreparedModel::executeSynchronously_1_3() או IPreparedModel::executeFenced() (או ערך ברירת המחדל אם לא צוין).

אימות

בדיקות זרימה בקרה הן חלק מחבילות הבדיקות של CTS ו-VTS. מידע נוסף זמין במאמר אימות.