เอกสารนี้จะอธิบายถึง 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
ในระหว่างรันไทม์)