رمز الخطأ: E2003

الفئة: وقت التجميع: محاذاة الوصول إلى الذاكرة غير المثبتة في Mosaic

يحدث هذا الخطأ عندما يحلّل المترجم عملية الوصول إلى الذاكرة (مثل vector.load أو vector.store أو tpu.load أو tpu.store) ويتعذّر عليه إثبات أنّ الفهرس الديناميكي المستخدَم لبُعد معيّن هو مضاعف لحجم التجانب المطلوب.

أمثلة على رسائل الخطأ:

INTERNAL: Mosaic failed to compile TPU kernel: cannot statically prove that index in dimension 1 is a multiple of 128

at location: ...

The MLIR operation involved:
  %14372 = "vector.load"(%14371, %93, %14363) : (memref<4x256xf32, #tpu.memory_space<vmem>>, index, index) -> vector<1x32xf32>

البرامج الخلفية في XLA: وحدة معالجة الموتّرات (TPU)

نظرة عامة

عندما تحمّل النواة أو تخزّن متّجهًا، يجب أن يتوافق عنوان الذاكرة (الذي يتم احتسابه من مؤشر الأساس بالإضافة إلى الفهرس الديناميكي) مع حجم التجانب للمتّجه على الجهاز. على سبيل المثال، إذا تم تقسيم أحد الأبعاد إلى 128 عنصرًا، يجب أن يكون الفهرس الديناميكي المستخدَم للوصول إليه هو 0 أو 128 أو 256 أو غير ذلك. تجدر الإشارة إلى أنّ العديد من العمليات (مثل عمليات تحميل وتخزين المتجهات) لا تتطلّب استخدام فهارس ثابتة.

يفرض المترجم هذا الشرط باستخدام التحليل الثابت. يتتبّع هذا الإجراء سجلّ متغيّر الفهرس من خلال العمليات الحسابية التي أدّت إلى إنشائه (مثل عمليات الضرب والجمع). إذا لم يتمكّن المترجم من ضمان (في وقت الترجمة) أنّ القيمة الناتجة ستكون قابلة للقسمة دائمًا على حجم التجانب، سيظهر هذا الخطأ.

يتعامل المترجم مع "عدم تطابق مثبت" و "عدم تطابق غير معروف" بشكل مماثل. لذا، إذا كنت تستخدم فهرسًا مضمونًا رياضيًا أن يكون غير متوافق (مثل i * 128 + 32)، سيُظهر المترجم الخطأ نفسه.

لذلك، يمكن أن يحدث هذا الخطأ في الحالات التالية:

  1. يمكنك استخدام متغيّر وقت التشغيل (الفهرس الديناميكي) للوصول إلى الذاكرة.
  2. منطق احتساب الفهرس معقّد جدًا بحيث لا يمكن للمترجم تحليله.
  3. المؤشر صالح رياضيًا ولكنّه يفتقر إلى دليل واضح في الرمز.
  4. يحدّد التحليل الثابت "عدم التطابق المثبت".

تصحيح الأخطاء

لحلّ هذا الخطأ، لديك الخيارات التالية:

1. تأكيد المحاذاة بشكل صريح

إذا كنت تعرف أنّ الفهرس صالح ولكن يتعذّر على المترجم البرمجي إثبات ذلك، استخدِم عملية tpu.assume_multiple. يعمل هذا كضمان للمترجم بأنّ القيمة قابلة للقسمة على عامل معيّن.

2. استخدام ميزة "الأحمال المتوازية" و"التدوير"

في السيناريوهات التي يكون فيها عدم التوافق مقصودًا، بدلاً من تحميل مقطع متّجه صغير غير متوافق:

  • يمكنك تحميل مربّع أكبر حجمًا ومحاذاته بالكامل، ثم تدوير القيم بمقدار ديناميكي لتحريك البيانات المطلوبة إلى الموضع المناسب (لأنّ شرائح المتجهات التي تتضمّن فهارس بدء ديناميكية غير متاحة). أو
  • أعِد تشكيل الموتر أو املأه بحيث تبدأ البيانات عند الفهرس 0 ويتطابق طول الخطوة بين عمليات الوصول مع المحاذاة على مستوى الجهاز.
    • مثال: إذا كنت تتكرّر على أجزاء بحجم 32 بدءًا من الإزاحة 1، ستكون الإزاحات 1 و33 و65 وما إلى ذلك. (غير متطابقة).
    • الحلّ: إعادة تجميع البيانات في موتر جديد يكون فيه الجزء الأول عند 0 ويتم توسيع البُعد إلى 128. تصبح الإزاحات 0 و128 و256 وما إلى ذلك، ما يستوفي متطلبات المحاذاة.

تستهلك هذه الطرق المزيد من الذاكرة، ولكنها غالبًا ما تبسّط منطق النواة وتلغي الحاجة إلى تأكيدات المحاذاة اليدوية.