الشكل 1
يوضح الشكل 1 كيفية وضع الصفيف F32[3,5] في الذاكرة مع تجانب 2×2. تتم كتابة
شكل بهذا التنسيق على النحو التالي F32[3,5]{1,0:T(2,2)}، حيث يشير الرقم 1,0 إلى الترتيب الفعلي للأبعاد (حقل minor_to_major
في التنسيق) بينما يشير الرقم (2,2)
بعد النقطتين الرأسيتين إلى تجانب الأبعاد الفعلية بواسطة مربّع 2×2.
ومن البديهي أن يتم وضع المربّعات لتغطية الشكل، ثم داخل كل مربّع، يتم وضع العناصر بدون تجانب، كما في المثال أعلاه، حيث يُظهر الجزء الأيمن من المثال التخطيط في الذاكرة، بما في ذلك عناصر المساحة المتروكة البيضاء التي تمت إضافتها للحصول على مربّعات 2×2 كاملة على الرغم من أن حدود الصفيفة الأصلية ليست كذلك.
لا يلزم أن تحتوي العناصر الإضافية في المساحة المتروكة على أي قيمة معينة.
صيغ الفهرس الخطي للتجانب مع تحديد شكل ومربّع
بدون التجانب، يتم وضع العنصر e=(en, en-1, ... , e1) في مصفوفة بحدود صفيفة d=(dn, dn-1, ... , d1) (d1 هو البُعد الأصغر) حسب الترتيب الرئيسي إلى الثانوي في الموضع:
line_index(e, d)
= line_index((en, en-1, ... , e1),
(dn, dn-1, ... , d1))
= endn-1...d1 +
n-1 +
n-1
لتبسيط الترميز في هذا المستند، نفترض أن المربع له نفس عدد أبعاد الصفيفة. في عملية تنفيذ التجانب في XLA، يتم تعميم ذلك على المساحات المتجانبة ذات الأبعاد الأقل من خلال ترك أبعاد الأولية الأكثر أهمّية بدون تغيير وتطبيق التصنيف المقسّم على الأصغر حجمًا فقط، بحيث يذكر المربّع المحدّد لاحقة الأبعاد المادية للشكل الذي يتم تقسيمه.
عند استخدام تجانب الحجم (tn, tn-1, ... , t1) يتم تعيين عنصر في المصفوفة يتضمّن فهارس (en وen-1 و... وe1) بهذا الموضع في التنسيق النهائي:
line_index_with_tile(e, d, t)
= line_index((⌊e/t⌋, e mod t), (⌈d/t⌉, t)) (arithmetic is
⌈e, e t t, ⌋ t/t
= الموحّد& مخطَّط ⌈, ⌈/t,n
يمكن اعتبار التخطيط مكوَّنًا من جزأين: (⌊en/tn⌋, ... , ⌊e1/t1⌋), أنّه يتجاوب مع فهرس مربّعات في مصفوفة من المربّعات بالحجم (⌈dn/tn⌉, ... و.mod n⌉, ... tmodn1, and1/mode. تظهر دالة ceil بالشكل ⌈di/ti⌉ لأنه إذا تخطت المربعات حدود الصفيف الأكبر، يتم إدراج المساحة المتروكة كما في الشكل 1. يتم وضع كل من البلاط والعناصر الموجودة داخل البلاطات بشكل متكرر دون تجانب.
بالنسبة للمثال في الشكل 1، يحتوي العنصر (2,3) على فهرس التجانب (1,1) وفهرس داخل المربع (0,1)، لمتجه إحداثي مدمج يبلغ (1,1,0,1). تحتوي فهارس الفئات على حدود (2,3) والمربّع نفسه هو (2,2) لمتّجه مجمّع (2,3,2,2). حينئذ يكون الفهرس الخطي مع مربع العنصر الذي يحتوي على الفهرس (2,3) في الشكل المنطقي
line_index_with_tile((2,3), (3,5), (2,2))
= inline_index((1,1,0,1), (2,3,2,2))
= line_index((1,1), (2,3)) 2 + line_index((0,1)),
(2, + (2,
)
تقسيم الصورة إلى أجزاء كتغيير موضع اللوحة
يعمل التنسيق المستند إلى تقسيم الشاشة على النحو التالي:
ضَع في الاعتبار مجموعة من الأبعاد (dn ، dn-1 ، ... ، d1) (d1 هي السمة الأكثر بساطة). وعند وضعه باستخدام تجانب الحجم (tn, tn-1, ... , t1) (يمثّل t1 البُعد الأصغر)، يمكن وصف هذا التجانب من حيث إعادة شكل اللوحة
على النحو التالي.
- تتم تعبئة الصفيف إلى (⌈dn/tn⌉∙tn, ... , ⌈d1/t1⌉∙t1).
- يتم تقسيم كل بُعد i إلى (⌈di/ti⌉,
ti)، أي تتم إعادة تشكيل المصفوفة إلى
(⌈dn/tn⌉, tn, ... , ⌈d1/t1⌉, t1).
لا يتم تغيير التصميم المادي في شكل إعادة الشكل هذه وحده، لذا إنّ هذا التغيير عبارة عن تسجيل بت. إذا لم يفكر المرء بشكل صريح في التجانب، فيمكن أن تعبر إعادة الشكل هذه عن أي شكل بنفس عدد العناصر مثل الشكل المبطّن - مثال هنا هو كيفية التعبير عن المربع بهذه الطريقة. - تحدث عملية تبديل الموضع عن طريق نقل n، ... ، t1 إلى الأبعاد الأصغر مع الحفاظ على ترتيبها النسبي، لكي يصبح ترتيب
الأبعاد من الأكبر إلى الأصغر حجمًا
(⌈dn/tn⌉, ... , ⌈d1/t1⌉, ...tn.
يحتوي الشكل النهائي على البادئة
(⌈dn/tn⌉, ... ,
⌈d1/t1⌉)، التي تصف عدد المربّعات في كل
سمة. يتم ربط عنصر في الصفيف (en, ... , e1) بهذا العنصر في الشكل النهائي:
(⌊en/tn⌋, ... ,
⌊e0/t0⌋, en mod tn, ... ,
e1). من السهل أن نرى أن الفهرس الخطي للعنصر
يتبع المعادلة أعلاه كما هو متوقع.
تجانب متكرّر
تصبح شاشات XLA أكثر مرونة من خلال تطبيقها بشكل متكرّر.
الشكل 2
يوضح الشكل 2 كيف يتم تجانب صفيف بحجم 4x8 بمستويَين من التجانب (الأول 2x4 ثم 2x1). ونمثل هذا التجانب المتكرر على أنه (2,4)(2,1). يشير كل لون إلى مربع 2x4 وكل مربع حد أحمر هو مربع 2x1. تشير الأرقام إلى الفهرس الخطي في ذاكرة هذا العنصر بتنسيق التجانب. ويتطابق هذا التنسيق مع التنسيق المستخدم لـ BF16 على TPU، باستثناء أن المربع الأولي أكبر، أي أن يكون التجانب (8,128)(2,1)، حيث يكون الغرض من التجانب الثاني بمقدار 2×1 هو جمع قيمتين من 16 بت لتكوين قيمة واحدة 32 بت بطريقة تتوافق مع بنية TPU.
تجدر الإشارة إلى أنّ مربّع الثاني أو المربّع التالي يمكن أن يشير إلى أبعاد المربّعات الثانوية، التي تعيد ترتيب البيانات داخل المربّع، كما في هذا المثال باستخدام (8,128)(2,1)، ولكن يمكن أن تشير أيضًا إلى الأبعاد الرئيسية على شكل مربّعات من المربّع السابق.
دمج الأبعاد باستخدام المربّعات
يتيح تجانب XLA أيضًا دمج الأبعاد. على سبيل المثال، يمكن دمج أبعاد في F32[2,7,8,11,10]{4,3,2,1,0} في F32[112,110]{1,0} أولاً قبل تقسيمها مع (2,3). والمربّع المستخدم هو (名,Universal,2,va,3). هنا علامة النجمة في أحد المربّعات تشير إلى أخذ هذا البُعد ودمجه مع البُعد الأصغر التالي. يمكن تجميع الأبعاد المجاورة المتعددة معًا في بُعد واحد. يتم تمثيل البُعد الفرعي بقيمة مربّع -1 في بُعد المربّع، وهو غير صالح بأي شكل آخر في المربّع كحجم بُعد.
وبشكل أكثر دقة، إذا تم التخلص من البُعد i في الشكل باستخدام علامة نجمية في المربّع، فقبل تطبيق التعريف السابق للتجانب، تتم إزالة ذلك البعد من الشكل المتجانب ومن متّجه الصورة المتجانبة، وقد زاد ارتباط الصفيف الذي كان البُعد i-1 للشكل من i-1 إلى didi-1. تتكرر هذه الخطوة لكل علامة نجمية في خط متجه التجانب.