Trang này được dịch bởi Cloud Translation API.
Switch to English

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 (viết tắt 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 kích thước. Thứ hạng thực sự của một mảng là số lượng kích thước 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 N chiều. Các số kích thước là nhãn tùy ý cho thuận tiện. Thứ tự của các số thứ nguyên này không ngụ ý một thứ tự nhỏ / chính 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, kích thước được liệt kê theo thứ tự tăng dần về số thứ nguyên. Ví dụ: đối với mảng 3 chiều có kích thước [A x B x C] , kích thước 0 có kích thước A , kích thước 1 có kích thước B và kích thước 2 có kích thước C

    Một số tiện ích trong XLA cũng hỗ trợ lập chỉ mục tiêu cực, tương tự như Python; kích thước -1 là kích thước cuối cùng (tương đương với N-1 cho mảng N chiều). Ví dụ: đối với mảng 3 chiều được mô tả ở trên, kích thước -1 có kích thước C , kích thước -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 kích thước. Ví dụ: đối với mảng 2D:

    • chiều 0: y
    • chiều 1: x

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

    • chiều 0: z
    • chiều 1: y
    • chiều 2: x

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

    • chiều 0: p
    • chiều 1: z
    • chiều 2: y
    • chiều 3: x
  • Các hàm trong API XLA có các thứ nguyên làm như vậy theo thứ tự tăng dần về số thứ nguyên. Điều 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 có mảng kích thước kích thước bao gồm dãy [A, B, C, D] .

Bố trí

Layout proto mô tả cách một mảng được biểu diễn trong bộ nhớ. Layout proto 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ự từ nhỏ đến lớn

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

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

 a b c
d e f
 

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

 a d b e c f
 

Thứ tự thứ nguyên từ nhỏ đến chính này từ 0 đến N-1 gần giống với cột chính (ở cấp 2). Giả sử một thứ tự kích thước đơn điệu, một tên khác mà chúng ta có thể sử dụng để chỉ bố cục này trong mã chỉ đơn giản là "dim 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 là:

 a b c d e f
 

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

Mặc định đặt hàng từ nhỏ đến lớn

Bố cục mặc định cho Hình dạng mới được tạo là "thứ tự kích thước là chính cho phụ" (gần giống với hàng chính ở cấp 2).

Đệm

Đệm được định nghĩa trong các trường padded_dimensionspadding_value tùy chọn. Trường padded_dimensions mô tả kích thước (chiều rộng) mà mỗi kích thước được đệ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ì kích thước 0 được đệm thành chiều rộng 3 và chiều 1 được đệm thành chiều rộng 5. Bố cục trong bộ nhớ tuyến tính (giả sử giá trị đệm của 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 cách bố trí của mảng sau với cùng thứ tự thứ nguyên từ nhỏ đế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 mảng

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