形狀和版面配置

XLA Shape proto (xla_data.proto) 會說明 N 維度陣列 (簡稱「陣列」) 的排名、大小和資料類型。

術語、符號與慣例

  • 陣列的排名等於維度數量。陣列的實際排名是大小大於 1 的維度數量。

  • N 維度陣列的維度從 0N-1 的編號。為方便起見,維度編號是任意標籤。這些維度編號的順序並不代表形狀版面配置中的特定次要/主要排序。版面配置是由 Layout proto 決定。

  • 依照慣例,維度會按照維度編號的遞增順序列出。舉例來說,如果是大小為 [A x B x C] 的 3 維陣列,維度 0 設有 A 大小,維度 1 具有 B 大小,而維度 2 具有 C 大小。

    XLA 中的部分公用程式也支援類似 Python 的排除索引:維度 -1 是最後一個維度 (相當於 N 維度陣列的 N-1)。例如,對於上述的 3 維陣列,維度 -1 的大小為 C,維度 -2 的大小為 B,以此類推。

  • 二、三和四個維度陣列通常會有與維度相關聯的特定字母。例如,如果是 2D 陣列:

    • 維度 0:y
    • 維度 1:x

    如果是 3D 陣列:

    • 維度 0:z
    • 維度 1:y
    • 維度 2:x

    如果是 4D 陣列:

    • 維度 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 proto 包含下列欄位:

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

小型到主要維度排序

唯一的必填欄位是 minor_to_major。這個欄位說明形狀內維度的最小排序方式。minor_to_major 中的值是陣列維度的順序 (N 維度陣列的 0N-1),第一個值是截至最後一個值最小的維度。最次要的維度是您在瀏覽線性記憶體中的陣列元素時,最快速變化的維度。

舉例來說,請考量以下大小為 [2 x 3] 的 2D 陣列:

a b c
d e f

此處的維度 0 是 2,尺寸「1」的大小為 3。如果版面配置中的 minor_to_major 欄位是 [0, 1],則維度 0 是最次要的維度,而維度 1 是最主要的維度。這與線性記憶體中的以下版面配置對應:

a d b e c f

這個子與主要維度順序0N-1column-major (排名為 2)。這裡假設維度的單調順序,我們可以在程式碼中參照這個版面配置的另一種方式,就是「dim 0 是次要的」。

另一方面,如果版面配置中的 minor_to_major 欄位是 [1, 0],則線性記憶體中的版面配置為:

a b c d e f

如果 N 維度陣列的 N-1 從小到最大的維度順序,向下到 0,則類似於「列-大部分」 (在第 2 名)。假設維度的單調順序,我們可以在程式碼中參照此版面配置的另一種方式,就是「dim 0 is main」。

預設由小到大排序

新建形狀的預設版面配置為「維度順序是最小到最小」 (類似於排名 2 的列-主要順序)。

邊框間距

邊框間距是在選用的 padded_dimensionspadding_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

建立陣列索引

index_util.h 中的 IndexUtil 類別提供公用程式,用於轉換指定形狀和版面配置的多維度索引和線性索引。多維度索引包含每個維度的 int64 索引。線性索引是單一 int64 值,會將這些值編入索引至保存陣列的緩衝區中。如要瞭解各種公用程式可簡化形狀和版面配置的建立和操作程序,請參閱相同目錄中的 shape_util.hlayout_util.h