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
đếnN-1
cho một mảng phương diệnN
. 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 protoLayout
.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ướcA
, phương diện 1 có kích thướcB
và phương diện 2 có kích thướcC
.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ệnN
). Ví dụ: đối với mảng 3 chiều được mô tả ở trên, chiều -1 có kích thướcC
, chiều -2 có kích thướcB
, 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
- phương diện 0:
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_dimensions
và padding_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
là [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.h
và layout_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.