پروتو XLA Shape
( xla_data.proto ) رتبه، اندازه و نوع داده یک آرایه N بعدی ( آرایه به طور خلاصه) را توصیف می کند.
اصطلاحات، نمادها و قراردادها
رتبه یک آرایه برابر است با تعداد ابعاد. رتبه واقعی یک آرایه تعداد ابعادی است که اندازه آنها بزرگتر از 1 است.
ابعاد از
0
تاN-1
برای یک آرایه بعدیN
شماره گذاری می شوند. اعداد ابعاد برای راحتی، برچسبهای دلخواه هستند. ترتیب این اعداد ابعاد به معنای نظم جزئی/عمده خاصی در چیدمان شکل نیست. طرح توسط پروتوLayout
تعیین می شود.طبق قرارداد، ابعاد به ترتیب افزایش تعداد ابعاد فهرست می شوند. به عنوان مثال، برای یک آرایه 3 بعدی با اندازه
[A x B x C]
، بعد 0 دارای اندازهA
، بعد 1 دارای اندازهB
، و بعد 2 دارای اندازهC
است.برخی از ابزارهای کاربردی در XLA همچنین از نمایه سازی منفی شبیه پایتون پشتیبانی می کنند: بعد -1 آخرین بعد است (معادل
N-1
برای یک آرایه بعدیN
). به عنوان مثال، برای آرایه سه بعدی که در بالا توضیح داده شد، بعد -1 دارای اندازهC
، بعد -2 دارای اندازهB
و غیره است.آرایه های دو، سه و چهار بعدی اغلب دارای حروف خاصی هستند که با ابعاد مرتبط هستند. به عنوان مثال، برای یک آرایه دو بعدی:
- بعد 0:
y
- بعد 1:
x
برای آرایه سه بعدی:
- بعد 0:
z
- بعد 1:
y
- بعد 2:
x
برای یک آرایه 4 بعدی:
- بعد 0:
p
- بعد 1:
z
- بعد 2:
y
- بعد 3:
x
- بعد 0:
توابع در XLA API که دارای ابعاد هستند این کار را به ترتیب افزایش تعداد ابعاد انجام می دهند. این با ترتیب استفاده شده در هنگام انتقال ابعاد به عنوان یک
initializer_list
مطابقت دارد. به عنوان مثالShapeUtil::MakeShape(F32, {A, B, C, D})
شکلی ایجاد می کند که آرایه اندازه ابعاد آن از دنباله
[A, B, C, D]
تشکیل شده است.
چیدمان
پروتو Layout
نحوه نمایش یک آرایه در حافظه را توضیح می دهد. پروتو Layout
شامل فیلدهای زیر است:
message Layout {
repeated int64 minor_to_major = 1;
repeated int64 padded_dimensions = 2;
optional PaddingValue padding_value = 3;
}
سفارش ابعاد کوچک به بزرگ
تنها فیلد ضروری minor_to_major
است. این فیلد ترتیب جزئی به بزرگ ابعاد را در یک شکل توصیف می کند. مقادیر در minor_to_major
ترتیبی از ابعاد آرایه ( 0
تا N-1
برای یک آرایه بعدی N
) است که اولین مقدار آن کوچکترین بعد تا آخرین مقدار است که بزرگترین بعد است. جزئی ترین بعد، بعد است که با عبور از عناصر آرایه که در حافظه خطی قرار گرفته اند، سریع ترین تغییر را می دهد.
به عنوان مثال، آرایه دو بعدی زیر را در اندازه [2 x 3]
در نظر بگیرید:
a b c
d e f
در اینجا بعد 0
اندازه 2 است و بعد 1
اندازه 3 است. اگر فیلد minor_to_major
در طرح [0, 1]
باشد، بعد 0
کوچکترین بعد و بعد 1
بزرگترین بعد است. این با چیدمان زیر در حافظه خطی مطابقت دارد:
a d b e c f
این ترتیب ابعاد کوچک به بزرگ از 0
تا N-1
شبیه به ستون اصلی (در رتبه 2) است. با فرض ترتیب یکنواخت ابعاد، راه دیگری که ممکن است به این طرح در کد اشاره کنیم این است که به سادگی "کم 0 جزئی است".
از طرف دیگر، اگر فیلد minor_to_major
در طرح بندی [1, 0]
باشد، طرح در حافظه خطی به صورت زیر است:
a b c d e f
ترتیب ابعاد کوچک به بزرگ از N-1
به 0
برای آرایه بعدی N
شبیه به ردیف اصلی (در رتبه 2) است. با فرض نظم یکنواخت ابعاد، راه دیگری که میتوانیم به این طرحبندی در کد اشاره کنیم این است که "کم نور 0 اصلی است".
سفارش پیشفرض جزئی به عمده
طرح پیشفرض برای شکلهای جدید ایجاد شده «ترتیب ابعاد اصلی به کوچک است» است (مشابه ردیف اصلی در رتبه ۲).
لایه گذاری
Padding در فیلدهای اختیاری padded_dimensions
و padding_value
تعریف شده است. فیلد padded_dimensions
اندازهها (عرضها) را توصیف میکند که هر بعد به آن اضافه میشود. در صورت وجود، تعداد عناصر در padded_dimensions
باید با رتبه شکل برابر باشد.
برای مثال، با توجه به آرایه [2 x 3]
که در بالا تعریف شده است، اگر padded_dimensions
[3, 5]
باشد، بعد 0 به عرض 3 و بعد 1 به عرض 5 اضافه می شود. طرح بندی در حافظه خطی (با فرض اینکه مقدار padding 0 و طرح ستون اصلی) است:
a d 0 b e 0 c f 0 0 0 0 0 0 0
این معادل طرح آرایه زیر با همان ترتیب ابعاد کوچک به بزرگ است:
a b c 0 0
d e f 0 0
0 0 0 0 0
نمایه سازی در آرایه ها
کلاس IndexUtil
در index_util.h ابزارهایی را برای تبدیل بین شاخص های چند بعدی و شاخص های خطی با یک شکل و طرح ارائه می دهد. شاخص های چند بعدی شامل یک شاخص int64
برای هر بعد هستند. شاخص های خطی یک مقدار int64
هستند که در بافر نگهدارنده آرایه ایندکس می شوند. برای ابزارهایی که ایجاد و دستکاری اشکال و طرحبندیها را ساده میکنند، shape_util.h
و layout_util.h
را در همان دایرکتوری ببینید.