شکل 1
شکل 1 نشان می دهد که چگونه یک آرایه F32[3,5] با کاشی کاری 2x2 در حافظه قرار می گیرد. شکلی با این طرحبندی بهصورت F32[3,5]{1,0:T(2,2)} نوشته میشود، که در آن 1،0 به ترتیب فیزیکی ابعاد مربوط میشود (فیلد minor_to_major
در Layout) در حالی که (2،2) بعد از کولون نشان دهنده کاشی کاری ابعاد فیزیکی توسط یک کاشی 2x2 است.
به طور شهودی، کاشیها برای پوشاندن شکل چیده میشوند و سپس در داخل هر کاشی، عناصر بدون کاشیکاری چیده میشوند، مانند مثال بالا، جایی که قسمت سمت راست مثال، چیدمان را در حافظه نشان میدهد، از جمله عناصر لایه سفید که به منظور داشتن کاشیهای 2x2 کامل حتی اگر محدودههای آرایه اصلی یکسان نیستند، اضافه شده است.
عناصر اضافی در بالشتک نیازی به داشتن مقدار خاصی ندارند.
فرمول های شاخص خطی برای کاشی کاری با یک شکل و یک کاشی
بدون کاشی کاری، یک عنصر e=(e n , e n-1 , ... , e 1 ) در آرایه ای با کران آرایه d=(d n , d n-1 , ... , d 1 ) (d1 است جزئی ترین بعد) به ترتیب عمده به جزئی در موقعیت قرار می گیرد:
شاخص_خطی (e, d)
= شاخص_خطی((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 ) به این نگاشت می شود. موقعیت در طرح نهایی:
خطی_شاخص_با_کاشی (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 )، که مربوط به یک نمایه درون کاشی است. تابع سقف در ⌈d 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) در شکل منطقی است
خطی_شاخص_با_کاشی((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.
کاشی کاری به عنوان pad-reshape-transpose
چیدمان مبتنی بر کاشی کاری به شرح زیر عمل می کند:
آرایه ای از ابعاد را در نظر بگیرید (d n , d n-1 , ... , d1) (d1 جزئی ترین بعد است). هنگامی که با کاشی کاری به اندازه (t n ، t n-1 ، ...، t 1 ) چیده می شود (t 1 جزئی ترین بعد است)، آن کاشی کاری را می توان برحسب شکل پد-تغییر شکل-تقابلی در زیر توصیف کرد. مسیر.
- آرایه به (⌈d n /t n ⌉∙t n , ... , ⌈d 1 /t 1 ⌉∙t 1 ) اضافه می شود.
- هر بعد i به (⌈d i /t i ⌉, t i ) شکسته می شود، یعنی آرایه به شکل دیگری در می آید
(⌈d n /t n ⌉, t n , ... , ⌈d 1 /t 1 ⌉, t 1 ).
هیچ تغییری در چیدمان فیزیکی در این تغییر شکل به خودی خود وجود ندارد، بنابراین این تغییر شکل یک بیتکست است. اگر کسی به صراحت به کاشی کاری فکر نمی کند، این تغییر شکل می تواند هر شکلی را با تعداد عناصر مشابه شکل پد شده بیان کند - مثال در اینجا نحوه بیان کاشی به این روش است. - یک جابجایی با حرکت 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 افزایش یافته است. این مرحله برای هر ستاره در وکتور کاشی تکرار می شود.