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

Giao thức Shape XLA (xla_data.proto) mô tả thứ hạng, kích thước và kiểu dữ liệu của 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 đúng của một mảng là số lượng chiều có kích thước lớn hơn 1.

  • Các phương diện được đánh số từ 0 đến N-1 cho một 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 ngụ ý một thứ tự nhỏ/lớn cụ thể trong bố cục của hình dạng. Bố cục được xác định bởi proto Layout.

  • Theo quy ước, các kích thước đượ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 phương diện 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ợ lập chỉ mục phủ định 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 đối với mảng phương diện N). Ví dụ: đối với mảng 3 chiều được mô tả ở trên, chiều -1 có kích thước C, chiều -2 có kích thước B, v.v.

  • Các mảng 2, 3 và 4 chiều thường có các chữ cái cụ thể liên kết với 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 API XLA nhận kích thước theo thứ tự tăng dần số lượng phương diện. Điều này khớp với thứ tự được sử dụng khi truyề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 chuỗi [A, B, C, D].

Bố cục

Giao thức Layout mô tả cách biểu thị một mảng 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ự nhỏ đến lớn của 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 (0 đến N-1 đối với 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. Phương diện nhỏ nhất là phương diện thay đổi nhanh nhất khi duyệt qua các phần tử của mảng được bố trí 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 đây:

a b c
d e f

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

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 nhất đến nhỏ" (gần giống với số hàng chính ở xếp 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 được đệm vào. Nếu có, số lượng 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 thêm vào khoảng đệm bằng chiều rộng 3 và chiều 1 sẽ được thêm khoảng đệm vào chiều rộng 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ủa cột) là:

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

Điều 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ỏ đến lớn:

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

Lập chỉ mục thành 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ỉ báo 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 lưu giữ mảng đó. Xem shape_util.hlayout_util.h trong cùng một thư mục để biết các tiện ích giúp đơn giản hoá việc tạo và thao tác với hình dạng cũng như bố cục.