เอกสารนี้จะอธิบาย 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
ถูก
บริจาคขณะรันไทม์)