เอกสารนี้จะอธิบาย 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
หากต้องการระบุชื่อแทนแบบเป็นโปรแกรม ให้ดู API ของ XlaBuilder::SetUpAlias
การกำหนดชื่อแทนขณะรันไทม์
จะมีการระบุชื่อแทนที่กำหนดไว้ในขั้นตอนก่อนหน้าระหว่างการรวบรวม
ในระหว่างการดำเนินการ คุณจะใช้ API ของ LocalClient::RunAsync
ได้เพื่อเลือกว่าจะบริจาคบัฟเฟอร์หรือไม่
บัฟเฟอร์อินพุตไปยังโปรแกรมจะรวมไว้ใน ExecutionInput
ซึ่งในทางกลับกันจะมีแผนผัง MaybeOwningDeviceMemory
หากมีการระบุหน่วยความจำเป็นการเป็นเจ้าของ (การเป็นเจ้าของบัฟเฟอร์ไปยังรันไทม์ XLA) ระบบจะใช้บัฟเฟอร์จริงและจะทำการอัปเดตตามที่ขอโดย API ชื่อแทนเวลาคอมไพล์
อย่างไรก็ตาม หากไม่ได้บริจาคบัฟเฟอร์ที่ใช้นามแฝงในเวลาคอมไพล์ไว้ copy-protection จะมีการจัดสรรบัฟเฟอร์เอาต์พุตเพิ่มเติม O
ไว้ และคัดลอกเนื้อหาของบัฟเฟอร์อินพุต P
ที่จะเป็นชื่อแทนลงใน O
(เพื่อให้โปรแกรมทำงานราวกับว่ามีการบริจาค O
ในระหว่างรันไทม์)