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

يصف نموذج Shape XLA (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 التي تأخذ أبعادًا بناءً على ترتيب تصاعدي لرقم الأبعاد. يتطابق هذا مع الترتيب المستخدَم عند تمرير الأبعاد كـ 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). بافتراض وجود ترتيب رتيب للأبعاد، فإن إحدى الطرق الأخرى التي يمكننا بها الإشارة إلى هذا التخطيط في التعليمة البرمجية هي ببساطة "الdim 0 هو الرئيسي".

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

يكون التنسيق الافتراضي للأشكال التي تم إنشاؤها حديثًا هو "ترتيب الأبعاد أكبر إلى صغير" (يشبه الصف الرئيسي في الترتيب 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 في الدليل نفسه للحصول على أدوات مساعدة تسهّل إنشاء الأشكال والتنسيقات ومعالجتها.