پروتو XLA ShapeProto
( xla_data.proto ) تعداد ابعاد، اندازه و نوع داده یک آرایه N بعدی ( آرایه به طور خلاصه) را توصیف می کند.
اصطلاحات، نمادها و قراردادها
تعداد واقعی ابعاد یک آرایه تعداد ابعادی است که اندازه آنها بزرگتر از 1 باشد.
ابعاد از
0
تاN-1
برای یک آرایه بعدیN
شماره گذاری می شوند. اندازه یک بعد یک عدد صحیح غیر منفی است. به طور خاص، اندازه 0 معتبر است. اعداد ابعاد برای راحتی، برچسبهای دلخواه هستند. ترتیب این اعداد ابعاد به معنای نظم جزئی/عمده خاصی در چیدمان شکل نیست. طرح توسط پروتوLayoutProto
تعیین می شود.طبق قرارداد، ابعاد به ترتیب افزایش تعداد ابعاد فهرست می شوند. به عنوان مثال، برای یک آرایه 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]
تشکیل شده است.
طرح بندی
پروتو LayoutProto
نحوه نمایش یک آرایه در حافظه را توضیح می دهد. شامل فیلدهای زیر است:
message LayoutProto {
repeated int64 minor_to_major;
int64 tail_padding_alignment_in_elements;
...
}
سفارش ابعاد کوچک به بزرگ
تنها فیلد ضروری 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 اصلی است".
ترتیب پیشفرض جزئی به عمده
طرح پیشفرض برای شکلهای جدید ایجاد شده «ترتیب ابعاد اصلی به کوچک است» است (یعنی [N-1, ..., 0]
).
بالشتک
فیلد tail_padding_alignment_in_elements
تراز آرایه کاشیشده را بر حسب تعداد عناصر تعریف میکند. پس از اعمال کاشی کاری، عناصر بالشتکی در انتهای طرح اضافه می شوند تا زمانی که تعداد کل عناصر مضربی از این مقدار باشد.
نمایه سازی در آرایه ها
کلاس IndexUtil
در index_util.h ابزارهایی را برای تبدیل بین شاخص های چند بعدی و شاخص های خطی با یک شکل و طرح ارائه می دهد. شاخص های چند بعدی شامل یک شاخص int64
برای هر بعد هستند. شاخص های خطی یک مقدار int64
هستند که در بافر نگهدارنده آرایه ایندکس می شوند. برای ابزارهایی که ایجاد و دستکاری اشکال و طرحبندیها را ساده میکنند shape_util.h
و layout_util.h
در همان دایرکتوری ببینید.