รูปร่างและเลย์เอาต์

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
  • ฟังก์ชันใน 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 ในไดเรกทอรีเดียวกันสำหรับยูทิลิตีที่ช่วยลดความซับซ้อนในการสร้างและจัดการรูปร่างและเลย์เอาต์