ชื่อแทนใน 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

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

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

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

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

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