בריכות זיכרון

דף זה מתאר את מבני הנתונים והשיטות המשמשים לתקשורת יעילה של מאגרי אופרנד בין מנהל ההתקן למסגרת.

בזמן הידור המודל, המסגרת מספקת את הערכים של האופרנדים הקבועים לנהג. בהתאם למשך החיים של האופרנד הקבוע, ערכיו ממוקמים בוקטור 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 בפורמט 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 . עם כל המידע הממדים בשילוב, למאגר עשויים להיות ממדים או דירוג לא ידועים. במקרה כזה, המאגר נמצא במצב גמיש שבו הממדים קבועים כאשר משתמשים בו כקלט מודל ובמצב דינמי כאשר משתמשים בו כפלט מודל. ניתן להשתמש באותו מאגר עם צורות שונות של יציאות בביצועים שונים והנהג חייב לטפל בשינוי גודל המאגר כראוי.

תחום זיכרון הוא תכונה אופציונלית. נהג יכול לקבוע שהוא לא יכול לתמוך בבקשת הקצאה נתונה ממספר סיבות. לדוגמה:

  • למאגר המבוקש יש גודל דינמי.
  • למנהל ההתקן יש אילוצי זיכרון המונעים ממנו לטפל במאגרים גדולים.

ייתכן שמספר שרשורים שונים יקראו מהמאגר המנוהל על ידי מנהל ההתקן בו-זמנית. גישה למאגר בו-זמנית לכתיבה או קריאה/כתיבה אינה מוגדרת, אך אסור לה לקרוס את שירות מנהל ההתקן או לחסום את המתקשר ללא הגבלת זמן. מנהל ההתקן יכול להחזיר שגיאה או להשאיר את תוכן המאגר במצב בלתי מוגדר.