- HLO'ya eşzamansız işlemler eklemek zahmetlidir (ör.
all-reduce-start
veall-reduce-done
) tıklayın. - 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.