XLA Shape
PRO
(xla_data.proto)
อธิบายอันดับ ขนาด และประเภทข้อมูลของอาร์เรย์ N-dimensional (อาร์เรย์ใน
ชื่อย่อ)
คำศัพท์ สัญกรณ์ และแบบแผน
อันดับของอาร์เรย์จะเท่ากับจำนวนของมิติข้อมูล อันดับจริงของอาร์เรย์คือจำนวนมิติข้อมูลที่มีขนาดมากกว่า 1
มิติข้อมูลมีตัวเลขตั้งแต่
0
ถึงN-1
ของอาร์เรย์มิติข้อมูลN
หมายเลขมิติข้อมูลเป็นป้ายกํากับที่กําหนดเองเพื่อความสะดวก ลำดับของหมายเลขมิติข้อมูลเหล่านี้ไม่ได้บอกเป็นนัยถึงการจัดลำดับย่อย/หลักหนึ่งๆ ในเลย์เอาต์ของรูปร่าง เลย์เอาต์กำหนดโดยโปรโตคอลLayout
ตามรูปแบบ มิติข้อมูลจะแสดงตามลำดับของจำนวนมิติข้อมูลที่เพิ่มขึ้น เช่น สำหรับอาร์เรย์ 3 มิติที่มีขนาด
[A x B x C]
มิติข้อมูล 0 มีขนาดA
, มิติข้อมูลที่ 1 มีขนาดB
และมิติข้อมูลที่ 2 มีขนาดC
ยูทิลิตีบางรายการใน XLA รองรับการจัดทำดัชนีเชิงลบที่คล้ายกับ Python ด้วย โดยมิติข้อมูล -1 คือมิติข้อมูลสุดท้าย (เทียบเท่ากับ
N-1
สำหรับอาร์เรย์มิติข้อมูลN
) เช่น สำหรับอาร์เรย์ 3 มิติที่อธิบายไว้ข้างต้น มิติข้อมูล -1 มีขนาดC
มิติข้อมูล -2 มีขนาดB
และอื่นๆอาร์เรย์แบบ 2, 3 และ 4 มิติมักมีตัวอักษรเฉพาะที่เชื่อมโยงกับมิติข้อมูล ตัวอย่างเช่น สำหรับอาร์เรย์ 2 มิติ
- มิติข้อมูล 0:
y
- มิติข้อมูล 1:
x
สำหรับอาร์เรย์ 3 มิติ:
- มิติข้อมูล 0:
z
- มิติข้อมูล 1:
y
- มิติข้อมูล 2:
x
สำหรับอาร์เรย์ 4 มิติ:
- มิติข้อมูล 0:
p
- มิติข้อมูล 1:
z
- มิติข้อมูล 2:
y
- มิติข้อมูล 3:
x
- มิติข้อมูล 0:
ฟังก์ชันใน XLA API ซึ่งจะนำมิติข้อมูลไปใช้ในลำดับตัวเลขมิติข้อมูลที่เพิ่มขึ้น ซึ่งจะตรงกับการจัดลำดับที่ใช้เมื่อส่งมิติข้อมูลเป็น
initializer_list
เช่นShapeUtil::MakeShape(F32, {A, B, C, D})
จะสร้างรูปร่างที่อาร์เรย์ขนาดมิติข้อมูลประกอบด้วยลำดับ
[A, B, C, D]
เลย์เอาต์
โปรโตคอล Layout
อธิบายวิธีแสดงอาร์เรย์ในหน่วยความจำ Proto Layout
ประกอบด้วยช่องต่อไปนี้
message Layout {
repeated int64 minor_to_major = 1;
repeated int64 padded_dimensions = 2;
optional PaddingValue padding_value = 3;
}
การเรียงลำดับมิติข้อมูลเล็กน้อยถึงหลัก
ช่องที่ต้องกรอกเพียงช่องเดียวคือ minor_to_major
ฟิลด์นี้อธิบายถึงการจัดลำดับขนาดภายในรูปร่างมากไปน้อย ค่าใน minor_to_major
คือลำดับของมิติข้อมูลของอาร์เรย์ (0
ถึง N-1
สำหรับอาร์เรย์มิติข้อมูล N
) โดยค่าแรกเป็นมิติข้อมูลรองมากที่สุดไปจนถึงค่าสุดท้ายซึ่งเป็นมิติข้อมูลหลักมากที่สุด มิติข้อมูลที่สำคัญที่สุดคือมิติข้อมูลที่มีการเปลี่ยนแปลงอย่างรวดเร็วที่สุดเมื่อเดินทางผ่านองค์ประกอบต่างๆ ของอาร์เรย์ที่วางไว้ในหน่วยความจำเชิงเส้น
ตัวอย่างเช่น ลองพิจารณาอาร์เรย์ 2 มิติของขนาด [2 x 3]
ต่อไปนี้
a b c
d e f
มิติข้อมูล 0
คือขนาด 2 และขนาด 1
คือขนาด 3 หากช่อง minor_to_major
ในเลย์เอาต์คือ [0, 1]
มิติข้อมูล 0
จะเป็นมิติข้อมูลรองที่สุด และมิติข้อมูล 1
คือมิติข้อมูลที่สำคัญที่สุด ซึ่งจะสอดคล้องกับเลย์เอาต์ต่อไปนี้ในหน่วยความจำเชิงเส้น
a d b e c f
ลำดับมิติข้อมูลเล็กน้อยถึงหลักนี้ของ 0
ถึง N-1
คล้ายกับคอลัมน์หลัก
(ที่อันดับ 2) สมมติว่ามีการจัดลำดับขนาดแบบโมโนโทน อีกวิธีที่เราอาจอ้างอิงเลย์เอาต์นี้ในโค้ดก็คือ "หรี่ 0 ถือว่าไม่มาก"
ในทางกลับกัน หากช่อง minor_to_major
ในเลย์เอาต์เป็น [1, 0]
เลย์เอาต์ในหน่วยความจำเชิงเส้นจะเป็นดังนี้
a b c d e f
ลำดับมิติข้อมูลรองจากเรื่องหลักจาก N-1
ลงไปถึง 0
สำหรับอาร์เรย์มิติข้อมูล N
มีลักษณะคล้ายกับแถวหลัก (ที่อันดับ 2) สมมติว่ามีการจัดลำดับขนาดแบบโมโนโทนิก อีกวิธีหนึ่งที่เราอาจอ้างอิงเลย์เอาต์นี้ในโค้ดก็คือ "หรี่ 0 คือหลัก"
การเรียงลำดับจากน้อยถึงหลักเริ่มต้น
เลย์เอาต์เริ่มต้นสำหรับรูปร่างที่สร้างขึ้นใหม่คือ "ลำดับมิติข้อมูลเป็นหลักถึงย่อย" (คล้ายกับแถวหลักที่อันดับ 2)
ระยะห่างจากขอบ
ระยะห่างจากขอบจะกำหนดในช่อง padded_dimensions
และ padding_value
ที่ไม่บังคับ ช่อง padded_dimensions
อธิบายขนาด (ความกว้าง) ที่จะเสริมมิติข้อมูลแต่ละรายการ หากมี จำนวนองค์ประกอบใน padded_dimensions
ต้องเท่ากับอันดับของรูปร่าง
เช่น ตามอาร์เรย์ [2 x 3]
ที่กำหนดข้างต้น หาก padded_dimensions
คือ [3, 5]
ระบบจะเพิ่มมิติข้อมูล 0 ให้มีความกว้างเป็น 3 ส่วนมิติข้อมูล 1 จะเพิ่มความกว้างเป็น 5 เลย์เอาต์ในหน่วยความจำเชิงเส้น (สมมติว่ามีค่า Padding เป็น 0 และเลย์เอาต์หลักของคอลัมน์) ดังนี้
a d 0 b e 0 c f 0 0 0 0 0 0 0
ซึ่งเทียบเท่ากับเลย์เอาต์ของอาร์เรย์ต่อไปนี้ที่มีลําดับมิติข้อมูลรองถึงหลักเหมือนกัน
a b c 0 0
d e f 0 0
0 0 0 0 0
การจัดทำดัชนีเป็นอาร์เรย์
คลาส IndexUtil
ใน index_util.h มีค่ายูทิลิตีสำหรับการแปลงระหว่างดัชนีหลายมิติและดัชนีเชิงเส้น
ตามรูปร่างและเลย์เอาต์ ดัชนีหลายมิติจะมีดัชนี int64
สำหรับแต่ละมิติข้อมูล ดัชนีเชิงเส้นเป็นค่า int64
ค่าเดียวที่จัดทำดัชนีในบัฟเฟอร์ที่เก็บอาร์เรย์ โปรดดู shape_util.h
และ layout_util.h
ในไดเรกทอรีเดียวกันสำหรับยูทิลิตีที่ช่วยลดความซับซ้อนในการสร้างและจัดการรูปร่างและเลย์เอาต์