Şekiller ve düzen

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çin 0 ile N-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 boyutu A, boyut 1'in boyutu B ve boyut 2'nin boyutu C olur.

    XLA'daki bazı yardımcı programlar, Python benzeri negatif dizine eklemeyi de destekler: Boyut -1, son boyuttur (N boyut dizisi için N-1'ye karşılık gelir). Örneğin, yukarıda açıklanan 3 boyutlu dizi için boyut -1 boyutu C, boyut -2 boyutu B ş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
  • 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.