דף זה תורגם על ידי Cloud Translation API.
Switch to English

פריסת אריחים

איור 1

איור 1 מראה כיצד מערך F32 [3,5] מונח בזיכרון עם רעפים 2x2. צורה עם פריסה זו נכתבת בשם F32 [3,5] {1,0: (2,2)}, כאשר 1,0 מתייחסת לסדר הפיזי של הממדים (שדה_to_major שדה בפריסה) ואילו (2,2) לאחר המעי הגס מצביע על אריח של המידות הפיזיות על ידי אריח 2x2.

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

האלמנטים הנוספים בריפוד אינם נדרשים להכיל ערך מסוים.

נוסחאות אינדקס ליניאריות לריצוף בהינתן צורה ואריח

ללא ריצוף, אלמנט e = (e n , e n-1 , ..., e 1 ) במערך עם גבולות מערך d = (d n , d n-1 , ..., d 1 ) (d1 הוא המימד הקטין ביותר) מסודר לפי סדר מז'ורי עד מינורי במצב:

לינארי_ינדקס (ה, ד)
= לינארי_ינדקס ((e n , e n-1 , ..., e 1 ), (d n , d n-1 , ..., d 1 ))
= e n d n-1 ... d 1 + e n-1 d n-2 ... d 1 + ... + e 1

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

כאשר משתמשים בריצוף בגודל (t n , t n-1 , ..., t 1 ), ממופה אלמנט במערך עם מדדים (e n , e n-1 , ..., e 1 ) מיקום במערך הסופי:

לינארי_index_with_tile (e, d, t)
= ליניארי_אינדקס ((⌊e / t⌋, e mod t), (⌈d / t⌉, t)) (אריתמטיקה היא אלמנטרית, (a, b) היא שרשור)
= לינארי_ינדקס ((⌊e n / t n ⌋, ..., ⌊e 1 / t 1 ⌋, e n mod t n , ..., e 1 mod t 1 ), (⌈d n / t n ⌉, ..., ⌈d 1 / t 1 ⌉, t n , t n-1 , ..., t 1 ))
= לינארי_ינדקס ((⌊e n / t n ⌋, ..., ⌊e 1 / t 1 ⌋), (⌈d n / t n ⌉, ..., ⌈d 1 / t 1 ⌉)) ∙ t n t n-1 ... t 1 + linear_index ((e n mod t n , ..., e 1 mod t 1 ), (t n , t n-1 , ..., t 1 ))

ניתן לחשוב על הפריסה כעל שני חלקים: (⌊e n / t n ⌋, ..., ⌊e 1 / t 1 ⌋), התואם למדד אריחים במערך אריחים בגודל (⌈d n / t n ⌉, ..., ⌈d 1 / t 1 ⌉), ו- (e n mod t n , ..., e 1 mod t 1 ), אשר מתאים לאינדקס בתוך אריחים. פונקציית התקרה מופיעה ב- id i / t i ⌉ מכיוון שאם אריחים גוברים על גבול המערך הגדול יותר, הריפוד מוכנס כמו באיור 1. גם האריחים וגם האלמנטים בתוך האריחים מונחים רקורסיבית ללא ריצוף.

לדוגמא באיור 1, לאלמנט (2,3) יש אינדקס אריחים (1,1), ואינדקס בתוך האריחים (0,1), עבור וקטור קואורדינטות משולב של (1, 1, 0, 1). למדדי האריחים גבולות (2, 3) והאריח עצמו הוא (2, 2) עבור וקטור משולב של (2, 3, 2, 2). האינדקס הליניארי עם האריח עבור האלמנט עם האינדקס (2, 3) בצורה הלוגית הוא אם כן

לינארי_index_with_tile ((2,3), (3,5), (2,2))
= לינארית אינדקס ((1,1,0,1), (2,3,2,2))
= לינארית_אינדקס ((1,1), (2,3)) ∙ 2 ∙ 2 + לינארית אינדקס ((0,1), (2,2))
= (1 ∙ 3 + 1) ∙ 2 ∙ 2 + (0 ∙ 2 + 1)
= 17.

אריח כמעצב מחדש-טרנספר

פריסה מבוססת אריחים פועלת באופן הבא:
קחו למשל מערך של ממדים (ד n, d n-1, ..., D1) (D1 הוא המימד הכי קלים). כאשר הוא מונח עם ריצוף בגודל (t n , t n-1 , ..., t 1 ) (t 1 הוא הממד הזעיר ביותר), ניתן לתאר את הריצוף במונחים של שינוי צורה מחדש-טרנספר בצורה הבאה. דֶרֶך.

  1. המערך מרופד אל (⌈d n / t n ⌉ ∙ t n , ..., ⌈d 1 / t 1 ⌉ ∙ t 1 ).
  2. כל ממד i מחולק (⌈d i / t i ⌉, t i ), כלומר המערך מעוצב מחדש ל
    (⌈D n / t n ⌉, t n , ..., ⌈d 1 / t 1 ⌉, t 1 ).
    אין שינוי פריסה פיזית בעיצוב מחודש זה כשלעצמו, ולכן הצורה המחודשת הזו מעוצבת קצת. אם לא חושבים במפורש על ריצוף, צורה מחודשת זו יכולה לבטא כל צורה עם אותו מספר אלמנטים כמו הצורה המרופדת - הדוגמא כאן היא כיצד לבטא אריח בצורה זו.
  3. טרנספורמציה מתרחשת על ידי העברת t n , ..., t 1 לממדים המשניים ביותר תוך שמירה על הסדר היחסי שלהם, כך שסדר הממדים מהעיקריים ביותר למינוריים ביותר הופך להיות
    (⌈D n / t n ⌉, ..., ⌈d 1 / t 1 ⌉, t n , ..., t 1 ).

לצורה הסופית יש את הקידומת
(⌈D n / t n ⌉, ..., ⌈d 1 / t 1 ⌉), המתאר את מספר האריחים בכל מימד. אלמנט במערך (e n , ..., e 1 ) ממופה לאלמנט זה בצורה הסופית:
(⌊E n / t n ⌋, ..., ⌊e 0 / t 0 ⌋, e n mod t n , ..., e 1 mod t 1 ). קל לראות כי האינדקס הליניארי של האלמנט עוקב אחר הנוסחה לעיל כצפוי.

ריצוף חוזר ונשנה

הריצוף של XLA מתגמש עוד יותר על ידי יישוםו שוב ושוב.

איור 2

איור 2 מראה כיצד מערך בגודל 4x8 מוטה על ידי שתי רמות של ריצוף (תחילה 2x4 ואז 2x1). אנו מייצגים את הריצוף החוזר הזה כ (2,4) (2,1). כל צבע מציין אריח 2x4 וכל תיבת גבול אדומה היא אריח 2x1. המספרים מציינים את האינדקס הליניארי בזיכרון של אותו אלמנט בתבנית המרוצפת. פורמט זה תואם את הפורמט המשמש ל- BF16 ב- TPU, פרט לכך שהאריח ההתחלתי גדול יותר, כלומר האריח הוא (8,128) (2,1), כאשר מטרת האריח השנייה על ידי 2x1 היא לאסוף יחד שני ערכי 16 סיביות ל יוצרים ערך 32 סיביות אחד באופן המתיישר לארכיטקטורה של TPU.

שים לב שאריח שני או מאוחר יותר יכול להתייחס לשני הממדים הקטינים בתוך האריחים, שרק מסדרים מחדש נתונים בתוך האריח, כמו בדוגמה זו עם (8,128) (2,1), אך יכולים גם להתייחס לאריח הנגדי הראשי. מידות מהריצוף הקודם.

שילוב מידות בעזרת אריחים

הריצוף של XLA תומך גם בשילוב מידות. לדוגמה, הוא יכול לשלב מידות ב- F32 [2,7,8,11,10] {4,3,2,1,0} ל- F32 [112,110] {1,0} קודם לפני האריח אותו עם (2,3 ). האריח המשמש הוא (∗, ∗, 2, ∗, 3). כאן כוכבית באריח מרמזת על לקיחת מימד זה ושילובו עם הממד הבא יותר מינורי. ניתן לחבר יחד ממדים מרובים סמוכים לממד אחד. ממד מצומצם מיוצג על ידי ערך אריח של -1 בממד זה של האריח, שאינו תקף אחרת באריח כגודל ממד.

ליתר דיוק, אם מבטלים מימד i של הצורה באמצעות כוכבית באריח, אז לפני שמיושמת ההגדרה הקודמת של הריצוף, ממד זה מוסר גם מהצורה שעוברת וגם מהווקטור האריח, ומה היה ממד i-1 של הצורה מערך הגבול שלה גדל מ- d i-1 ל- d i d i-1 . שלב זה חוזר על עצמו לכל כוכבית בווקטור האריחים.