اشکال و چیدمان

پروتو 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
  • توابع در 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 در همان دایرکتوری ببینید.