XLA Shape
protokolü (xla_data.proto), N boyutlu bir dizinin (kısaca dizi) sıralamasını, boyutunu ve veri türünü tanımlar.
Terminoloji, notasyon ve kurallar
Dizinin sıralaması, boyut sayısına eşittir. Bir dizinin gerçek sıralaması, boyutu 1'den büyük olan boyutların sayısıdır.
Boyutlar,
N
boyut dizisi için0
ileN-1
arasında numaralandırılır. Boyut numaraları, kullanım kolaylığı sağlamak için isteğe bağlı etiketlerdir. Bu boyut numaralarının sırası, şeklin düzeninde belirli bir küçük/büyük sıralamayı ima etmez. Düzen,Layout
protokolü tarafından belirlenir.Geleneksel olarak, boyutlar, boyut sayısına göre artan bir sıralamayla listelenir. Örneğin,
[A x B x C]
boyutundaki 3 boyutlu bir dizi için boyut 0'ın boyutuA
, boyut 1'in boyutuB
ve boyut 2'nin boyutuC
olur.XLA'daki bazı yardımcı programlar, Python benzeri negatif dizine eklemeyi de destekler: Boyut -1, son boyuttur (
N
boyut dizisi içinN-1
'ye karşılık gelir). Örneğin, yukarıda açıklanan 3 boyutlu dizi için boyut -1 boyutuC
, boyut -2 boyutuB
şeklinde devam eder.İki, üç ve dört boyutlu dizilerde genellikle boyutlarla ilişkili belirli harfler bulunur. Örneğin, 2D bir dizi için:
- boyut 0:
y
- boyut 1:
x
3D dizi için:
- boyut 0:
z
- boyut 1:
y
- boyut 2:
x
4D dizi için:
- boyut 0:
p
- boyut 1:
z
- boyut 2:
y
- boyut 3:
x
- boyut 0:
XLA API'de bulunan ve boyutları alan işlevler, bunu boyut sayısı sırasına göre yapar. Bu, boyutları
initializer_list
olarak geçirirken kullanılan sıralamayla eşleşir; ör.ShapeUtil::MakeShape(F32, {A, B, C, D})
boyut dizisi
[A, B, C, D]
dizisinden oluşan bir şekil oluşturur.
Düzen
Layout
protokolü, bir dizinin bellekte nasıl temsil edildiğini açıklar. Layout
protokolü aşağıdaki alanları içerir:
message Layout {
repeated int64 minor_to_major = 1;
repeated int64 padded_dimensions = 2;
optional PaddingValue padding_value = 3;
}
Küçükten ana boyuta sıralama
Yalnızca minor_to_major
alanının doldurulması zorunludur. Bu alan, bir şeklin içindeki boyutların küçükten anaya sıralanmasını açıklar. minor_to_major
içindeki değerler, dizinin boyutlarının sıralamasıdır (N
boyut dizisi için 0
ile N-1
arası). İlk değer, en ana boyut olan son değere kadar en küçük boyuttur. En küçük boyut, doğrusal bellekte yer alan dizinin öğeleri arasında gezinirken en hızlı şekilde değişen boyuttur.
Örneğin, aşağıdaki [2 x 3]
boyutundaki 2D dizisini ele alalım:
a b c
d e f
Burada 0
boyutu 2, 1
boyutu 3'tür. Düzendeki minor_to_major
alanı [0, 1]
ise 0
boyutu en küçük boyut, 1
boyutu ise en büyük boyuttur. Bu, doğrusal bellekte aşağıdaki düzene karşılık gelir:
a d b e c f
0
ile N-1
arasındaki bu küçükten ana boyut sırası, sütun-ana değerine benzer (2. sırada). Boyutların monotonik bir sırada olduğunu varsaydığımızda, kodda bu düzene atıfta bulunmanın bir başka yolu da "loş 0 küçüktür"dür.
Diğer yandan, düzendeki minor_to_major
alanı [1, 0]
ise doğrusal bellekteki düzen şöyle olur:
a b c d e f
N
boyutlu bir dizi için N-1
değerinden 0
'ye kadar küçükten ana boyut sırası, satır-ana (sıra 2) ile benzerdir. Boyutların tek tip olduğunu varsaydığımızda, kodda bu düzene gönderme yapabileceğimiz başka bir yol da "dim 0 büyüktür"dür.
Varsayılan küçükten anaya sıralama
Yeni oluşturulan şekiller için varsayılan düzen "boyut sırası anadan küçüke" şeklindedir (2. sıradaki satıra benzer).
Dolgu
Dolgu, isteğe bağlı padded_dimensions
ve padding_value
alanlarında tanımlanır. padded_dimensions
alanı, her bir boyutun doldurulduğu boyutları (genişlikler) açıklar. Varsa padded_dimensions
içindeki öğe sayısı, şeklin sıralamasına eşit olmalıdır.
Örneğin, yukarıda tanımlanan [2 x 3]
dizisi verildiğinde padded_dimensions
[3, 5]
olursa 0 boyutu 3 genişlikle doldurulur ve 1 boyut 5 genişlik kadar doldurulur. Doğrusal bellekteki düzen (dolgu değerinin 0 ve sütun ana düzeni varsayıldığında):
a d 0 b e 0 c f 0 0 0 0 0 0 0
Bu, aynı küçükten anayasa boyut sırasına sahip aşağıdaki dizinin düzenine eşdeğerdir:
a b c 0 0
d e f 0 0
0 0 0 0 0
Dizilere dizine ekleme
index_util.h içindeki IndexUtil
sınıfı, belirli bir şekil ve düzene sahip çok boyutlu dizinler ile doğrusal dizinler arasında dönüştürme yapmak için yardımcı programlar sunar. Çok boyutlu dizinlerde her boyut için bir int64
dizini bulunur. Doğrusal dizinler, dizini içeren arabelleğe alan tek bir int64
değeridir. Şekil ve düzen oluşturma ve yönetmeyi basitleştiren yardımcı programlar için aynı dizinde shape_util.h
ve layout_util.h
konularına bakın.