ชื่อแทนใน 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 รายการ โดยรายการหนึ่งสำหรับอินพุต %p และอีกรายการสำหรับเอาต์พุต %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

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

การกำหนดชื่อแทนขณะรันไทม์

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

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

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