החל מאנדרואיד 11, ה-NNAPI כולל שתי פעולות זרימת בקרה, IF
ו- WHILE
, שלוקחות מודלים אחרים כארגומנטים ומבצעות אותם באופן מותנה ( IF
) או שוב ושוב ( WHILE
). זה מאפשר לבנות מודלים המבצעים פעולות שונות על סמך ערכי הקלט או לבצע פעולות מספר פעמים מבלי להתגלגל. זה חשוב למקרי שימוש כמו RNN דינמי ו-seq2seq.
ב-NN HAL 1.3, המודל משלב מספר תת-גרפים, כולל תת-גרף הראשי המשמש לציון קלט ופלט של ביצוע. תת-גרף יכול להתייחס לתתי-גרפים אחרים באמצעות אופרנדים מסוג SUBGRAPH
. המסגרת יכולה לשלוח פעולת זרימת בקרה למאיץ רק אם המאיץ תומך בכל הפעולות בכל התתי-גרפים שמתייחסים לאותה פעולת זרימת בקרה.
ממשקי 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
, שהשיטות שלו 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. למידע נוסף, ראה אימות .