形狀和版面配置

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-1 的微小到大維度順序,類似於欄 - 主要 (排名為 2)。假設維度的單調順序,我們就在程式碼中將這個版面配置稱為「模擬 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