تعليمات HLO غير المتزامنة

  1. تعتبر إضافة عمليات غير متزامنة إلى HLO أمرًا مرهقًا (مثل all-reduce-start all-reduce-done).
  2. قد يكون تقسيم البداية والقسم "تمّ" غير كافٍ لبعض الاستخدامات غير المتزامنة. الحالات.

لاستهداف العيب الأول، نقترح تقديم مجموعة أخيرة من نقاط القصور الجديدة رموز العمليات غير المتزامنة: kAsyncStart وkAsyncUpdate وkAsyncDone. الفكرة هو إنشاء رمز تشغيل عام غير متزامن يمكنه أن يتضمن أي تعليمات من تعليمات HLO. سيتم ترميز العملية الفعلية التي سيتم تنفيذها بشكل غير متزامن باستخدام عملية حسابية تشتمل فقط على التعليمات كجذر لها وأي المعاملات للمدخلات. معالجة المخزن المؤقت للإدخال/الإخراج أثناء الطيران وتسمية التسمية المستعارة بعد ذلك يمكن مشاركتها لأي عملية غير متزامنة. تتضمن تعليمات البدء غير المتزامن الإخراج عبارة عن صف من معاملات الإدخال وقيم المخرجات حالة متوسطة مطلوبة للسمة async-update أو async-done على التعليمات

%async_op {
  %param0 = f32[64] parameter(0)
  ROOT %op = f32[32] op(f32[64] %param0), op_specific_attr=foo
}

%async-start = (f32[64], f32[32], s32[]) async-start(f32[64] %operand),
                                         calls=%async_op
%async-done = f32[32] async-done((f32[64], f32[32], s32[]) %async-start)

في التمثيل أعلاه، هناك عملية حسابية تسمى الدالة async-start فقط، حيث من السهل إيجاد ما يفعله async-done من خلال اتّباع معامله أوجِد async-start المقابل لإيجاد العملية الحسابية المُسمّاة.

ملاحظة أيضًا أن العنصر الأول في صف الإخراج للأسماء المستعارة async-start مع بحيث يظل المخزن المؤقت نشطًا حتى يتم تنفيذ التعليمات غير المتزامنة على الأقل. وبالمثل، فإن العنصر الثاني له أسماء مستعارة مع إخراج async-done، العنصر الثالث هو حالة السياق المستخدمة لتتبع عملية غير متزامنة. يدعم هذا التمثيل أيضًا العديد من عوامل الأوتار في مدخل العملية غير المتزامنة و/أو المخرجات وتعمل التسمية المستعارة بنفس الطريقة الطريقة:

%async_op {
  %param0 = f32[64] parameter(0)
  %param1 = f32[64] parameter(1)
  ROOT %op = (f32[32], f32[32]) op(f32[64] %param0, f32[64] %param1),
                                op_specific_attr=foo
}

%async-start = ((f32[64], f32[64]), (f32[32], f32[32]), s32[])
               async-start(f32[64] %operand0, f32[64] %operand1),
               calls=%async_op
%async-done = (f32[32], f32[32]) async-done(%async-start)

علاوة على ذلك، يمكن تحليل العملية إلى صفر أو أكثر من async-update. الخطوات التي تقوم بإجراء عمليات حسابية متوسطة. الاسم المستعار للإدخال/الإخراج يعمل بالطريقة نفسها مع تعليمات async-update وكل async-start يجب أن تتضمن تعليمات async-update مستخدمًا واحدًا آخر. async-update أو async-done:

%async_op {
  %param0 = f32[64] parameter(0)
  ROOT %op = f32[32] op(f32[64] %param0), op_specific_attr=foo
}

%async-start = (f32[64], f32[32], s32[]) async-start(f32[64] %operand),
                                         calls=%async_op
%async-update0 = (f32[64], f32[32], s32[]) async-update(
                           (f32[64], f32[32], s32[]) %async-start)
%async-update1 = (f32[64], f32[32], s32[]) async-update(
                           (f32[64], f32[32], s32[]) %async-update0)
%async-done = f32[32] async-done((f32[64], f32[32], s32[]) %async-update1)

سكر البنية

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

%op-start = (f32[64], f32[32], s32[]) op-start(f32[64] %operand),
                                      op_specific_attr=foo
%op-update0 = (f32[64], f32[32], s32[]) op-update(
                        (f32[64], f32[32], s32[]) %op-start),
                        op_specific_attr=foo
%op-update1 = (f32[64], f32[32], s32[]) op-update(
                        (f32[64], f32[32], s32[]) %op-update0)
%op-done = f32[32] op-done((f32[64], f32[32], s32[]) %op-update1)

ولتفادي الالتباس، لن تسمح أداة التحقق بإجراء أي بـ async-start إذا حددنا بوضوح رمز عملية العملية باللاحقتين "-start" و/أو "-done". هذا أيضًا هروب في حال توفُّر أي تعليمات تتطلّب علاجًا بمستوى HLO لا يتناسب مع النموذج الموضح أعلاه (على سبيل المثال، التسمية المستعارة للإدخال/الإخراج والموارد الاحتياطية). في البداية، copy-start/copy-done، سيستمر استخدام collective-permute-start/collective-permute-done وما إلى ذلك رموز عملياتهم من الدرجة الأولى بدلاً من عدد رموز العمليات: async-start/async-done إلى أن يتم تنظيف الرمز لإزالة هذه الرموز عمليات "-start"/"-done".