XLA Shape
proto (xla_data.proto) 說明 N 維度陣列的排名、大小和資料類型 (簡稱「陣列」)。
術語、標記和慣例
陣列的排名等於維度數量。陣列的「實際排名」是指大小大於 1 的維度數量。
N
維度陣列的維度編號從0
到N-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
- 維度 0:
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
維度陣列的 0
到 N-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
從 0
到 N-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_dimensions
和 padding_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.h
和 layout_util.h
。