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
至 column-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_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
。