בקרת זרימה

החל מ-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, שה-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. למידע נוסף, ראו אימות.