דף זה מתאר את מבני הנתונים והשיטות המשמשים לתקשורת יעילה של מאגרי אופרנד בין מנהל ההתקן למסגרת.
בזמן הידור המודל, המסגרת מספקת את הערכים של האופרנדים הקבועים לנהג. בהתאם למשך החיים של האופרנד הקבוע, ערכיו ממוקמים בוקטור HIDL או במאגר זיכרון משותף.
- אם משך החיים הוא
CONSTANT_COPY
, הערכים ממוקמים בשדהoperandValues
של מבנה המודל. מכיוון שהערכים בווקטור HIDL מועתקים במהלך תקשורת בין-תהליכים (IPC), זה משמש בדרך כלל רק כדי להחזיק כמות קטנה של נתונים כגון אופרנדים סקלרים (לדוגמה, סקלר ההפעלה ב-ADD
) ופרמטרים קטנים של טנסור (לדוגמה, טנסור הצורה ב-RESHAPE
). - אם משך החיים הוא
CONSTANT_REFERENCE
, הערכים ממוקמים בשדהpools
של מבנה המודל. רק נקודות האחיזה של מאגר הזיכרון המשותף משוכפלות במהלך IPC במקום העתקת הערכים הגולמיים. לכן, יעיל יותר להחזיק כמות גדולה של נתונים (לדוגמה, פרמטרי משקל בפיתולים) באמצעות מאגרי זיכרון משותפים מאשר וקטורים HIDL.
בזמן ביצוע המודל, המסגרת מספקת את החוצצים של אופרנדי הקלט והפלט למנהל ההתקן. שלא כמו קבועי זמן ההידור שעלולים להישלח בווקטור HIDL, נתוני הקלט והפלט של ביצוע מועברים תמיד דרך אוסף של מאגרי זיכרון.
סוג הנתונים HIDL hidl_memory
משמש הן בהידור והן בביצוע כדי לייצג מאגר זיכרון משותף לא ממופה. מנהל ההתקן צריך למפות את הזיכרון בהתאם כדי להפוך אותו לשימוש בהתבסס על השם של סוג הנתונים hidl_memory
. שמות הזיכרון הנתמכים הם:
-
ashmem
: זיכרון משותף לאנדרואיד. לפרטים נוספים, ראה זיכרון . -
mmap_fd
: זיכרון משותף המגובה על ידי מתאר קובץ דרךmmap
. -
hardware_buffer_blob
: זיכרון משותף המגובה על ידי AHardwareBuffer בפורמטAHARDWARE_BUFFER_FORMAT_BLOB
. זמין מ-Neural Networks (NN) HAL 1.2. לפרטים נוספים, ראה AHardwareBuffer . -
hardware_buffer
: זיכרון משותף המגובה על ידי AHardwareBuffer כללי שאינו משתמש בפורמטAHARDWARE_BUFFER_FORMAT_BLOB
. מאגר החומרה שאינו במצב BLOB נתמך רק בביצוע דגם. זמין מ-NN HAL 1.2. לפרטים נוספים, ראה AHardwareBuffer .
מ-NN HAL 1.3, NNAPI תומך בתחומי זיכרון המספקים ממשקי מקצים למאגרים המנוהלים על ידי מנהל ההתקן. המאגרים המנוהלים על ידי מנהל ההתקן יכולים לשמש גם ככניסות או פלטים לביצוע. לפרטים נוספים, ראה תחומי זיכרון .
מנהלי התקנים של NNAPI חייבים לתמוך במיפוי של שמות זיכרון ashmem
ו- mmap_fd
. מ-NN HAL 1.3, מנהלי התקנים חייבים לתמוך גם במיפוי של hardware_buffer_blob
. תמיכה בתחומי hardware_buffer
וזיכרון כלליים שאינם במצב BLOB היא אופציונלית.
AHardwareBuffer
AHardwareBuffer הוא סוג של זיכרון משותף שעוטף מאגר Gralloc . באנדרואיד 10, ה-Neural Networks API (NNAPI) תומך בשימוש ב- AHardwareBuffer , המאפשר לנהג לבצע פעולות ללא העתקת נתונים, מה שמשפר את הביצועים ואת צריכת החשמל של אפליקציות. לדוגמה, מחסנית HAL של מצלמה יכולה להעביר אובייקטים של AHardwareBuffer ל-NNAPI עבור עומסי עבודה של למידת מכונה באמצעות נקודות האחיזה של AHardwareBuffer שנוצרות על ידי ממשקי API של מצלמה NDK ומדיה NDK. למידע נוסף, ראה ANeuralNetworksMemory_createFromAHardwareBuffer
.
אובייקטי AHardwareBuffer המשמשים ב-NNAPI מועברים למנהל ההתקן דרך מבנה hidl_memory
בשם hardware_buffer
או hardware_buffer_blob
. מבנה hidl_memory
hardware_buffer_blob
מייצג רק אובייקטים של AHARDWAREBUFFER_FORMAT_BLOB
בפורמט AHARDWAREBUFFER_FORMAT_BLOB.
המידע הנדרש על ידי המסגרת מקודד בשדה hidl_handle
של מבנה hidl_memory
. השדה hidl_handle
עוטף את native_handle
, המקודד את כל המטא נתונים הנדרשים לגבי AHardwareBuffer או Gralloc buffer.
על הנהג לפענח כראוי את השדה hidl_handle
המסופק ולגשת לזיכרון המתואר על ידי hidl_handle
. כאשר קוראים לשיטת getSupportedOperations_1_2
, getSupportedOperations_1_1
או getSupportedOperations
, מנהל ההתקן צריך לזהות אם הוא יכול לפענח את ה- hidl_handle
המסופק ולגשת לזיכרון המתואר על ידי hidl_handle
. הכנת המודל חייבת להיכשל אם השדה hidl_handle
המשמש לאופרנד קבוע אינו נתמך. הביצוע חייב להיכשל אם השדה hidl_handle
המשמש לאופרנד קלט או פלט של הביצוע אינו נתמך. מומלץ לנהג להחזיר קוד שגיאה GENERAL_FAILURE
אם הכנת הדגם או הביצוע נכשלים.
תחומי זיכרון
עבור מכשירים עם אנדרואיד 11 ומעלה, NNAPI תומך בדומיינים של זיכרון המספקים ממשקי מקצים למאגרים מנוהלים על ידי נהגים. זה מאפשר להעביר זיכרונות מקוריים של התקן על פני ביצועים, לדכא העתקת נתונים מיותרים ושינוי בין ביצועים עוקבים על אותו דרייבר. זרימה זו מומחשת באיור 1.
איור 1. זרימת נתונים מאגר באמצעות תחומי זיכרון
תכונת תחום הזיכרון מיועדת לטנזורים שהם לרוב פנימיים למנהל ההתקן ואינם זקוקים לגישה תכופה בצד הלקוח. דוגמאות לטנזורים כאלה כוללות את טנסור המדינה במודלים של רצף. עבור טנזורים שזקוקים לגישה תכופה למעבד בצד הלקוח, עדיף להשתמש במאגרי זיכרון משותפים.
כדי לתמוך בתכונת תחום הזיכרון, IDevice::allocate
כדי לאפשר למסגרת לבקש הקצאת מאגר מנוהלת על ידי מנהל ההתקן. במהלך ההקצאה, המסגרת מספקת את המאפיינים ודפוסי השימוש הבאים עבור המאגר:
-
BufferDesc
מתאר את המאפיינים הנדרשים של המאגר. -
BufferRole
מתאר את דפוס השימוש הפוטנציאלי של המאגר כקלט או פלט של מודל מוכן. ניתן לציין מספר תפקידים במהלך הקצאת המאגר, והמאגר המוקצה יכול לשמש רק כתפקידים שצוינו.
המאגר המוקצה הוא פנימי למנהל ההתקן. מנהל התקן יכול לבחור כל מיקום מאגר או פריסת נתונים. כאשר המאגר מוקצה בהצלחה, הלקוח של מנהל ההתקן יכול להפנות או לקיים אינטראקציה עם המאגר באמצעות האסימון המוחזר או אובייקט IBuffer
.
האסימון מ- IDevice::allocate
מסופק כאשר מתייחסים למאגר כאחד מאובייקטי MemoryPool
במבנה Request
של ביצוע. כדי למנוע מתהליך לנסות לגשת למאגר שהוקצה בתהליך אחר, על מנהל ההתקן להחיל אימות מתאים בכל שימוש במאגר. על הנהג לאמת שהשימוש במאגר הוא אחד מתפקידי BufferRole
שסופקו במהלך ההקצאה ועליו להיכשל בביצוע באופן מיידי אם השימוש אינו חוקי.
האובייקט IBuffer
משמש להעתקת זיכרון מפורשת. במצבים מסוימים, הלקוח של מנהל ההתקן חייב לאתחל את המאגר המנוהל על ידי מנהל ההתקן ממאגר זיכרון משותף או להעתיק את המאגר החוצה למאגר זיכרון משותף. מקרי שימוש לדוגמה כוללים:
- אתחול טנזור המדינה
- שמירה במטמון של תוצאות ביניים
- ביצוע Fallback במעבד
כדי לתמוך במקרים של שימוש אלה, על מנהל ההתקן ליישם את IBuffer::copyTo
ו- IBuffer::copyFrom
עם ashmem
, mmap_fd
ו- hardware_buffer_blob
אם הוא תומך בהקצאת תחום זיכרון. זה אופציונלי עבור מנהל ההתקן לתמוך ב- hardware_buffer
במצב שאינו BLOB.
במהלך הקצאת מאגר, ניתן להסיק את הממדים של המאגר מאופרנדים המתאימים של המודל של כל התפקידים שצוינו על ידי BufferRole
, ומהמימדים הניתנים ב- BufferDesc
. עם כל המידע הממדים בשילוב, למאגר עשויים להיות ממדים או דירוג לא ידועים. במקרה כזה, המאגר נמצא במצב גמיש שבו הממדים קבועים כאשר משתמשים בו כקלט מודל ובמצב דינמי כאשר משתמשים בו כפלט מודל. ניתן להשתמש באותו מאגר עם צורות שונות של יציאות בביצועים שונים והנהג חייב לטפל בשינוי גודל המאגר כראוי.
תחום זיכרון הוא תכונה אופציונלית. נהג יכול לקבוע שהוא לא יכול לתמוך בבקשת הקצאה נתונה ממספר סיבות. לדוגמה:
- למאגר המבוקש יש גודל דינמי.
- למנהל ההתקן יש אילוצי זיכרון המונעים ממנו לטפל במאגרים גדולים.
ייתכן שמספר שרשורים שונים יקראו מהמאגר המנוהל על ידי מנהל ההתקן בו-זמנית. גישה למאגר בו-זמנית לכתיבה או קריאה/כתיבה אינה מוגדרת, אך אסור לה לקרוס את שירות מנהל ההתקן או לחסום את המתקשר ללא הגבלת זמן. מנהל ההתקן יכול להחזיר שגיאה או להשאיר את תוכן המאגר במצב בלתי מוגדר.