يصف نموذج 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
- السمة 0:
الدوال في واجهة برمجة تطبيقات 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
في الدليل نفسه للحصول على أدوات مساعدة تسهّل إنشاء الأشكال والتنسيقات ومعالجتها.