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

XLA Shape proto (xla_data.proto) อธิบายอันดับ ขนาด และประเภทข้อมูลของอาร์เรย์ N มิติ (อาร์เรย์ ในแบบสั้น)

คำศัพท์ สัญกรณ์ และแบบแผน

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