- تعتبر إضافة عمليات غير متزامنة إلى HLO أمرًا مرهقًا (مثل
all-reduce-start
all-reduce-done
). - قد يكون تقسيم البداية والقسم "تمّ" غير كافٍ لبعض الاستخدامات غير المتزامنة. الحالات.
لاستهداف العيب الأول، نقترح تقديم مجموعة أخيرة من نقاط القصور الجديدة
رموز العمليات غير المتزامنة: 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".