الأشكال والتخطيط

يصف نموذج Shape الأولي (xla_data.proto) الترتيب والحجم ونوع البيانات لمصفوفة الأبعاد N (صفيف باختصار).

المصطلحات والترميز والاصطلاحات

  • ترتيب مصفوفة يساوي عدد الأبعاد. الترتيب الحقيقي لمصفوفة هو عدد الأبعاد التي يزيد حجمها عن 1.

  • يتمّ ترقيم السمات من 0 حتى N-1 لمصفوفة الأبعاد N. أرقام الأبعاد هي تصنيفات عشوائية لتسهيل الاستخدام. إنّ ترتيب أرقام الأبعاد هذه لا يشير ضمنًا إلى ترتيب قاصر/كبير في تخطيط الشكل. يتم تحديد التنسيق من خلال النموذج الأوّلي Layout.

  • حسب الطريقة، يتم سرد الأبعاد بترتيب تصاعدي لرقم البُعد. على سبيل المثال، بالنسبة إلى مصفوفة ثلاثية الأبعاد بحجم [A x B x C]، تكون للبُعد 0 الحجم A، والبُعد 1 هو الحجم B، والبُعد 2 هو C.

    تتوافق بعض الأدوات في XLA أيضًا مع الفهرسة السالبة الشبيهة بلغة Python: البُعد -1 هو البُعد الأخير (يعادل N-1 لمصفوفة الأبعاد N). على سبيل المثال، بالنسبة إلى المصفوفة الثلاثية الأبعاد الموضّحة أعلاه، يكون للبُعد -1 حجم C، والبُعد -2 بحجم B، وهكذا.

  • غالبًا ما تحتوي الصفائف الثانية والثلاثية وأربعة الأبعاد على أحرف محددة مرتبطة بأبعاد. على سبيل المثال، بالنسبة إلى صفيفة ثنائية الأبعاد:

    • السمة 0: y
    • السمة 1: x

    بالنسبة إلى صفيفة ثلاثية الأبعاد:

    • السمة 0: z
    • السمة 1: y
    • السمة 2: x

    بالنسبة لصفيف رباعي الأبعاد:

    • السمة 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). بافتراض الترتيب الرتيب للأبعاد، هناك طريقة أخرى يمكن أن نشير إليها في هذا التنسيق في التعليمة البرمجية ببساطة وهي "dim 0 ثانوي".

من ناحية أخرى، إذا كان الحقل minor_to_major في التنسيق هو [1, 0]، يكون التنسيق في الذاكرة الخطية على النحو التالي:

a b c d e f

إنّ ترتيب الأبعاد من المستوى الثانوي إلى الأكبر بقيمة N-1 ووصولاً إلى 0 للمصفوفة البُعدية N يكون مشابهًا لصف كبير (في الترتيب 2). بافتراض وجود ترتيب رتيب للأبعاد، هناك طريقة أخرى يمكن أن نشير إلى هذا التخطيط فيها في التعليمة البرمجية هي ببساطة "dim 0 is large".

الترتيب التلقائي من قاصر إلى كبير

التخطيط الافتراضي للأشكال التي تم إنشاؤها حديثًا هو "ترتيب الأبعاد أساسي إلى صغير" (أقرب إلى الصف الرئيسي في الترتيب 2).

مساحة متروكة

يتم تحديد المساحة المتروكة في الحقلين padded_dimensions وpadding_value الاختياريين. يصف الحقل padded_dimensions الأحجام (العرض) التي تتم إضافة مساحة لكل سمة إليها. في حال وجودها، يجب أن يساوي عدد العناصر في padded_dimensions ترتيب الشكل.

على سبيل المثال، في مصفوفة [2 x 3] المحدّدة أعلاه، إذا كان padded_dimensions هو [3, 5]، تتم إضافة البُعد 0 إلى العرض 3 والبُعد 1 تتم إضافته إلى العرض 5. التخطيط في الذاكرة الخطية (بافتراض أن قيمة المساحة المتروكة 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 في الدليل نفسه للاطّلاع على برامج المساعدة التي تسهّل إنشاء الأشكال والتنسيقات ومعالجتها.