Ş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ü 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 boyutlar 0 ile N-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 boyutu A, boyut 1 boyutu B ve boyut 2 boyutu C olur.

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