Eş Zamansız HLO Talimatları

  1. HLO'ya eşzamansız işlemler eklemek zahmetlidir (ör. all-reduce-start ve all-reduce-done) tıklayın.
  2. Eşzamansız kullanımın bir kısmı için başlangıç ve bitti bölme işlemleri yeterli olmayabilir durumlarda işe yarar.

İlk eksikliği hedeflemek için, bahsi geçen bazı yeni ve eşzamansız işlem kodları: kAsyncStart, kAsyncUpdate ve kAsyncDone. Fikir herhangi bir HLO talimatını sarmalayabilecek genel bir eşzamansız işlem kodu oluşturmaktır. Eşzamansız olarak gerçekleştirilecek olan gerçek işlem, Bu hesaplamaya yalnızca talimatın kökü ve tüm giriş parametreleridir. Yayın sırasında giriş/çıkış arabelleğinin işlenmesi ve takma adlandırılması sonra herhangi bir eşzamansız işlemler için paylaşılabilir. Eş zamansız başlangıç talimatının çıkış şekli ise giriş işlenenlerinin, çıkış değerlerinin ve async-update veya async-done için gereken ara durum bakın.

%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)

Yukarıdaki gösterimde, yalnızca async-start için hesaplama olarak adlandırılan bir özellik vardır async-done öğesinin işlenenini izleyerek ne yaptığını bulmak çok önemlidir: denilen async-start değerini bulun.

Ayrıca şunlara dikkat edin: async-start takma adlarının çıkış grubundaki ilk öğenin işlenene kadar arabellek, en azından eşzamansız tamamlanan talimata kadar aktif kalır. Benzer şekilde, async-done çıkışıyla ikinci öğe takma adları ve üçüncü öğe, içeriğin durumunu izlemek için kullanılan eşzamansız işlem. Bu temsil aynı zamanda eşzamansız işlem giriş ve/veya çıkışı ve takma ad aynı şekilde çalışır. yol:

%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)

Ayrıca, işlem sıfır veya daha fazla async-update değerine ayrıştırılabilir ileri düzey hesaplamalar yapan adımlardır. Giriş/çıkış takma adı oluşturma, async-update talimatıyla ve her async-start ve async-update talimatlarında, ikisinden biri kullanıcı olmalıdır async-update veya 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)

Söz dizimi şekeri

Yapılacak işlemi tanımlamak için ayrı bir hesaplamaya zaman çizelgesine yer vermemek biraz zahmetli olsa da, dönüşüm hunisinin tamamını kapsayan eşzamansız işlemleri birinci sınıf gibi otomatik olarak yazdırır ve ayrıştırır işlem kodları. Buradaki amaç, "-start", "-update" ve "-done" soneklerini işlemektir özel olarak hesaplamayı ve talimatı otomatik olarak oluşturarak ( soneki) kullanır. Örneğin, yukarıdaki kod snippet'i güzel bir şekilde ve ikisi de aynı gösterime ayrıştırılabilir:

%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)

Belirsizlik oluşturmamak amacıyla doğrulayıcı, Bunun için açık bir şekilde bir işlem kodu tanımladıysak eşzamansız başlangıç işlemi "-start" ve/veya "-done" sonekleriyle yapmanızı sağlar. Bu aynı zamanda bir kaçış olması gerektiğini unutmayın. yukarıda açıklanan modele uymuyor (ör. arabellek). Yani başlangıçta copy-start/copy-done, collective-permute-start/collective-permute-done vb. kullanmaya devam edecek yeni yerine ilgili birinci sınıf işlem kodları Bunları kaldırmak için kod temizlenene kadar async-start/async-done işlem kodları "-start"/"-done" işlemleri için geçerlidir.