XLA Shape
protokolü (xla_data.proto), N boyutlu bir dizinin (kısaca dizi) sıralamasını, boyutunu ve veri türünü açıklar.
Terminoloji, gösterim 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.
N
boyutlu bir dizi için boyutlar0
ileN-1
arasında numaralandırılmıştır. Boyut numaraları, kullanım kolaylığı açısından rastgele etiketlerdir. Bu boyut numaralarının sırası, şeklin düzeninde belirli bir küçük/ana sıralama olduğunu göstermez. Düzen,Layout
protokolü tarafından belirlenir.Kurallara göre, boyutlar, boyut sayısının artan sırasına göre listelenir. Örneğin,
[A x B x C]
boyutlu 3 boyutlu bir dizi için boyut 0 boyutuA
, boyut 1 boyutuB
ve boyut 2 boyutuC
olur.XLA'daki bazı yardımcı programlar Python benzeri negatif dizine eklemeyi de destekler: Boyut -1, son boyuttur (
N
boyutlu dizi içinN-1
değerine karşılık gelir). Örneğin, yukarıda açıklanan 3 boyutlu dizi için -1 boyutuC
boyutuna, -2 boyutuB
boyutuna sahiptir ve bu şekilde devam eder.İki, üç ve dört boyutlu dizilerde genellikle boyutlarla ilişkilendirilmiş özel harfler bulunur. Örneğin, 2D bir dizi için:
- boyut 0:
y
- 1. boyut:
x
3D dizi için:
- boyut 0:
z
- 1. boyut:
y
- 2. boyut:
x
4D dizi için:
- boyut 0:
p
- 1. boyut:
z
- 2. boyut:
y
- boyut 3:
x
- boyut 0:
XLA API'sında boyutları alan işlevler bunu boyut sayısı sırasına göre artan işlevlerdir. Bu, boyutları
initializer_list
olarak geçirirken kullanılan sıralamayla eşleşir; ör.ShapeUtil::MakeShape(F32, {A, B, C, D})
boyutu, boyut dizisi
[A, B, C, D]
dizisinden oluşan bir şekil oluşturur.
Düzen
Layout
protokolü bir dizinin bellekte nasıl gösterildiğ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 anaya doğru boyut sıralaması
Yalnızca minor_to_major
alanının doldurulması zorunludur. Bu alan, bir şekil içindeki boyutların küçükten anaya doğru sıralamasını açıklar. minor_to_major
içindeki değerler, dizinin boyutlarının sıralamasıdır (N
boyutlu bir dizi için 0
ile N-1
arası). İlk değer, en büyük boyut olan son değere kadarki en küçük boyuttur. En küçük boyut, doğrusal belleğe yerleştirilmiş dizinin öğeleri arasında gezinirken en hızlı şekilde değişen boyuttur.
Örneğin, aşağıdaki [2 x 3]
boyutundaki 2D diziyi ele alalım:
a b c
d e f
Burada 0
boyutu 2, 1
boyutu 3 boyutudur. Düzendeki minor_to_major
alanı [0, 1]
ise 0
boyutu en küçük boyut, 1
boyutu ise en ana 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üçük-ana boyut sırası, sütun-ana değerine benzer (2. sırada). Boyutların monotonik bir sıralamasını varsaydığımızda, kodda bu düzene atıfta bulunmamızın bir başka yolu da "karar 0 azdı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
değerine kadar küçük-ana boyut sırası, satır-büyük (sıra 2) ile benzerdir. Boyutların monoton bir sıralamasını varsaydığımızda, kodda bu düzene gönderme yapabileceğimiz başka bir yol da "karar 0 büyüktür" ifadesidir.
Varsayılan küçükten anaya sıralama
Yeni oluşturulan şekiller için varsayılan düzen "boyut sırası büyükten 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) tanımlar. 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]
ise 0 boyutu 3 genişlik, 1. boyut ise 5 genişlik olacak şekilde doldurulur. Doğrusal bellekteki düzen (dolgu değerinin 0 ve sütun ana düzeni olduğu varsayıldığında):
a d 0 b e 0 c f 0 0 0 0 0 0 0
Bu, aynı küçük-ana 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üzende çok boyutlu dizinler ile doğrusal dizinler arasında dönüşüm gerçekleştirmede yardımcı programlar sunar. Çok boyutlu dizinler, her bir boyut için bir int64
dizini içerir. Doğrusal dizinler, diziyi barındıran arabelleğe dizin oluşturan tek bir int64
değeridir. Şekil ve düzen oluşturmayı ve işlemeyi basitleştiren yardımcı programlar için aynı dizinde shape_util.h
ve layout_util.h
bölümlerine bakın.