Hình dạng và bố cục

Proto Shape XLA (xla_data.proto) mô tả thứ hạng, kích thước và kiểu dữ liệu của một mảng N-chiều (gọi ngắn gọn là mảng).

Thuật ngữ, ký hiệu và quy ước

  • Thứ hạng của một mảng bằng số lượng chiều. Thứ hạng thực của một mảng là số lượng chiều có kích thước lớn hơn 1.

  • Kích thước được đánh số từ 0 đến N-1 cho mảng phương diện N. Số phương diện là các nhãn tuỳ ý để thuận tiện. Thứ tự của các số kích thước này không bao hàm một thứ tự nhỏ/lớn cụ thể trong bố cục của hình dạng. Bố cục này do proto Layout xác định.

  • Theo quy ước, các phương diện được liệt kê theo thứ tự tăng dần số phương diện. Ví dụ: đối với một mảng 3 chiều có kích thước [A x B x C], phương diện 0 có kích thước A, phương diện 1 có kích thước B và phương diện 2 có kích thước C.

    Một số tiện ích trong XLA cũng hỗ trợ tính năng lập chỉ mục âm giống như Python: Phương diện -1 là phương diện cuối cùng (tương đương với N-1 cho một mảng phương diện N). Ví dụ: đối với mảng 3 chiều được mô tả ở trên, phương diện -1 có kích thước C, phương diện -2 có kích thước B, v.v.

  • Mảng hai, ba và bốn chiều thường có các chữ cái cụ thể liên quan đến các phương diện. Ví dụ: đối với mảng 2D:

    • phương diện 0: y
    • phương diện 1: x

    Đối với mảng 3D:

    • phương diện 0: z
    • phương diện 1: y
    • phương diện 2: x

    Đối với mảng 4D:

    • phương diện 0: p
    • phương diện 1: z
    • phương diện 2: y
    • phương diện 3: x
  • Các hàm trong XLA API nhận các kích thước theo thứ tự tăng dần số phương diện. Thứ tự này khớp với thứ tự được sử dụng khi chuyển kích thước dưới dạng initializer_list; ví dụ:

    ShapeUtil::MakeShape(F32, {A, B, C, D})

    sẽ tạo một hình dạng có mảng kích thước kích thước bao gồm trình tự [A, B, C, D].

Bố cục

Proto Layout mô tả cách một mảng được biểu thị trong bộ nhớ. Proto Layout bao gồm các trường sau:

message Layout {
  repeated int64 minor_to_major = 1;
  repeated int64 padded_dimensions = 2;
  optional PaddingValue padding_value = 3;
}

Thứ tự phương diện từ nhỏ đến chính

Trường bắt buộc duy nhất là minor_to_major. Trường này mô tả thứ tự từ nhỏ nhất đến lớn nhất của các kích thước trong một hình dạng. Giá trị trong minor_to_major là thứ tự các phương diện của mảng (từ 0 đến N-1 đối với một mảng phương diện N), trong đó giá trị đầu tiên là phương diện nhỏ nhất cho đến giá trị cuối cùng là phương diện chính nhất. Nhóm nhỏ nhất là nhóm thay đổi nhanh nhất khi di chuyển qua các phần tử của mảng nằm trong bộ nhớ tuyến tính.

Ví dụ: hãy xem xét mảng 2D có kích thước [2 x 3] sau:

a b c
d e f

Ở đây, phương diện 0 là kích thước 2 và phương diện 1 là kích thước 3. Nếu trường minor_to_major trong bố cục là [0, 1], thì kích thước 0 là kích thước nhỏ nhất và kích thước 1 là kích thước chính nhất. Điều này tương ứng với bố cục sau trong bộ nhớ tuyến tính:

a d b e c f

Thứ tự kích thước từ nhỏ đến chính này từ 0 đến N-1 gần giống với cột-chính (ở xếp hạng 2). Giả sử thứ tự đơn điệu của các chiều, thì có một cách khác để chúng ta tham chiếu đến bố cục này trong mã chỉ là "giảm độ sáng 0 là nhỏ".

Mặt khác, nếu trường minor_to_major trong bố cục là [1, 0] thì bố cục trong bộ nhớ tuyến tính sẽ là:

a b c d e f

Thứ tự kích thước từ nhỏ đến chính từ N-1 xuống đến 0 cho một mảng thứ nguyên N gần giống với hàng lớn (ở xếp hạng 2). Giả sử thứ tự đơn điệu của các chiều, thì cách khác để chúng ta tham chiếu đến bố cục này trong mã chỉ đơn giản là "dim 0 is major".

Thứ tự mặc định từ nhỏ đến lớn

Bố cục mặc định cho các Hình dạng mới tạo là "thứ tự phương diện là lớn đến nhỏ" (gần giống với hàng lớn ở thứ hạng 2).

Khoảng đệm

Khoảng đệm được xác định trong các trường padded_dimensionspadding_value không bắt buộc. Trường padded_dimensions mô tả kích thước (chiều rộng) mà mỗi phương diện sẽ được khoảng đệm. Nếu có, số phần tử trong padded_dimensions phải bằng thứ hạng của hình dạng.

Ví dụ: với mảng [2 x 3] được xác định ở trên, nếu padded_dimensions[3, 5], thì chiều 0 sẽ được đệm cho chiều rộng là 3 và chiều 1 sẽ được đệm cho chiều rộng là 5. Bố cục trong bộ nhớ tuyến tính (giả sử giá trị khoảng đệm là 0 và bố cục chính cột) là:

a d 0 b e 0 c f 0 0 0 0 0 0 0

Bố cục này tương đương với bố cục của mảng sau đây có cùng thứ tự kích thước từ nhỏ nhất đến chính:

a b c 0 0
d e f 0 0
0 0 0 0 0

Lập chỉ mục thành các mảng

Lớp IndexUtil trong index_util.h cung cấp các tiện ích để chuyển đổi giữa chỉ mục đa chiều và chỉ mục tuyến tính dựa trên hình dạng và bố cục. Chỉ mục đa chiều bao gồm một chỉ mục int64 cho mỗi chiều. Chỉ mục tuyến tính là một giá trị int64 duy nhất lập chỉ mục vào vùng đệm chứa mảng. Xem shape_util.hlayout_util.h trong cùng thư mục để biết các tiện ích giúp đơn giản hoá việc tạo và chỉnh sửa hình dạng cũng như bố cục.