ชื่อแทนใน XLA

เอกสารนี้จะอธิบาย API ชื่อแทนของ XLA ซึ่งช่วยให้คุณระบุฟิลด์ ที่เป็นนามแฝงระหว่างบัฟเฟอร์อินพุตและเอาต์พุตเมื่อสร้างโปรแกรม XLA

การกำหนดนามแฝงในเวลาคอมไพล์

เช่น ลองพิจารณาโมดูล HLO ที่ไม่สำคัญที่เพิ่ม 1 ในอินพุต

HloModule increment

ENTRY entry {
  %p = f32[] parameter(0)
  %c = f32[] constant(1)
  ROOT %out = f32[] add(%p, %c)
}

โมดูลนี้จะจัดสรรบัฟเฟอร์ 4 ไบต์ 2 รายการ คือ 1 รายการสำหรับอินพุต %p และ 1 รายการ สำหรับเอาต์พุต %out

อย่างไรก็ตาม เรามักแนะนำให้ดำเนินการอัปเดตแทน (ตัวอย่างเช่น หาก ในส่วนหน้าที่สร้างนิพจน์ ตัวแปรอินพุตจะใช้งานไม่ได้อีกต่อไป หลังการคำนวณ เช่น การเพิ่ม p++)

หากต้องการดำเนินการอัปเดตดังกล่าวอย่างมีประสิทธิภาพ คุณสามารถระบุชื่อแทนอินพุตได้ ดังนี้

HloModule increment, input_output_alias={ {}: 0 }

ENTRY entry {
  %p = f32[] parameter(0)
  %c = f32[] constant(1)
  ROOT %out = f32[] add(%p, %c)
}

รูปแบบระบุว่าเอาต์พุตทั้งหมด (ทำเครื่องหมายด้วย {}) เป็นชื่อแทน พารามิเตอร์อินพุต 0

หากต้องการระบุการใช้นามแฝงแบบเป็นโปรแกรม โปรดดู XlaBuilder::SetUpAlias API

การกำหนดนามแฝงขณะรันไทม์

ชื่อแทนที่กำหนดไว้ในขั้นตอนก่อนหน้าจะระบุในระหว่างการคอมไพล์ ระหว่างการดำเนินการ คุณสามารถใช้ LocalClient::RunAsync API สำหรับเลือกว่าจะบริจาคบัฟเฟอร์หรือไม่

บัฟเฟอร์อินพุตของโปรแกรมจะรวมอยู่ใน ExecutionInput วินาที ซึ่งก็มีต้นไม้ของ MaybeOwningDeviceMemory หากความทรงจำคือ ระบุเป็นการเป็นเจ้าของ (การเป็นเจ้าของบัฟเฟอร์จะส่งไปยังรันไทม์ของ XLA) จะมีการดาวน์โหลดบัฟเฟอร์จริงๆ และมีการดำเนินการอัปเดต ที่ขอโดย API ชื่อแทนขณะคอมไพล์

อย่างไรก็ตาม หากไม่มีการใช้บัฟเฟอร์ที่เป็นนามแฝงในเวลาคอมไพล์ รันไทม์การป้องกันสำเนาจะเริ่มต้นขึ้น: มีการจัดสรรบัฟเฟอร์เอาต์พุตเพิ่มเติม O และคัดลอกเนื้อหาของบัฟเฟอร์อินพุต P ที่ควรเป็นชื่อแทนแล้ว ลงใน O (เพื่อให้โปรแกรมทำงานราวกับว่าบัฟเฟอร์ O ถูก บริจาคขณะรันไทม์)