בקרת זרימה

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

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

ממשקי HAL

ב-NN HAL 1.3, ההגדרות שקשורות לבקרת זרימה נמצאות ב-types.hal.

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