Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Gekacheltes Layout

Abbildung 1

Abbildung 1 zeigt, wie ein Array F32 [3,5] mit 2x2-Kacheln im Speicher angeordnet ist. Eine Form mit diesem Layout wird als F32 [3,5] {1,0: (2,2)} geschrieben, wobei 1,0 sich auf die physikalische Reihenfolge der Dimensionen bezieht (Feld minor_to_major im Layout), während (2,2) danach Der Doppelpunkt zeigt die Kachelung der physischen Abmessungen durch eine 2x2-Kachel an.

Intuitive Kacheln werden so ausgelegt, dass sie die Form abdecken, und dann werden innerhalb jeder Kachel Elemente ohne Kacheln ausgelegt, wie im obigen Beispiel, wobei der rechte Teil des Beispiels das Layout im Speicher zeigt, einschließlich der hinzugefügten weißen Polsterelemente um vollständige 2x2-Kacheln zu haben, obwohl die ursprünglichen Array-Grenzen nicht gerade sind.

Die zusätzlichen Elemente in der Polsterung müssen keinen bestimmten Wert enthalten.

Lineare Indexformeln für Kacheln bei gegebener Form und Kachel

Ohne Fliese, ein Element e = (e n, e n-1, ..., e 1) in einem Array mit Feldgrenzen d = (d n, d n-1, ..., d 1) (d1 ist die kleinste Dimension) wird in der Reihenfolge von Dur nach Moll an der Position festgelegt:

linear_index (e, d)
= Linear_index ((e n, e n-1, ..., e 1), (d n, d n-1, ..., d 1))
= e n d n-1 ... d 1 + e n-1 d n-2 ... d 1 + ... + e 1

Zur Vereinfachung der Notation in diesem Dokument nehmen wir an, dass eine Kachel die gleiche Anzahl von Dimensionen wie das Array hat. Bei der Implementierung von Kacheln durch XLA wird dies auf Kacheln mit weniger Dimensionen verallgemeinert, indem die anfänglich wichtigsten Dimensionen unverändert bleiben und die Kacheln nur auf die kleinsten Dimensionen angewendet werden, sodass in der angegebenen Kachel ein Suffix der physischen Dimensionen der Kacheln erwähnt wird Form wird gekachelt.

Wenn die Größe Tiling (t n, t n-1, ..., t 1) verwendet wird, ein Element in dem Array mit dem Indizes (e n, e n-1, ..., e 1) an dieses kartiert Position im endgültigen Layout:

linear_index_with_tile (e, d, t)
= linearer_Index ((⌊e / t⌋, e mod t), (⌈d / t⌉, t)) (Arithmetik ist elementweise, (a, b) ist Verkettung)
= linearer_Index ((⌊e n / t n ⌋, ..., ⌊e 1 / t 1 ⌋, e n mod t n , ..., e 1 mod t 1 ), (⌈d n / t n ⌉, ..., ⌈d 1 / t 1 ⌉, t n , t n-1 , ..., t 1 ))
= linearer_Index ((⌊e n / t n ⌋, ..., ⌊e 1 / t 1 ⌋), (⌈d n / t n ⌉, ..., ⌈d 1 / t 1 ⌉)) ∙ t n t n-1 ... t 1 + linearer_Index ((e n mod t n , ..., e 1 mod t 1 ), (t n , t n-1 , ..., t 1 ))

Das Layout besteht aus zwei Teilen: (ne n / t n ⌋, ..., ⌊e 1 / t 1 ⌋), die einem Kachelindex in einem Array von Kacheln der Größe (⌈d n) entsprechen / t n ⌉, ..., ⌈d 1 / t 1 ⌉) und (e n mod t n , ..., e 1 mod t 1 ), was einem Index innerhalb der Kachel entspricht. Die Ceil-Funktion wird in ⌈d i / t i ⌉ angezeigt. Wenn Kacheln die Grenzen des größeren Arrays überschreiten, wird die Auffüllung wie in Abbildung 1 eingefügt. Sowohl die Kacheln als auch die Elemente innerhalb der Kacheln werden rekursiv ohne Kacheln angeordnet.

Für das Beispiel in 1 hat das Element (2,3) einen Kachelindex (1,1) und einen Kachelindex (0,1) für einen kombinierten Koordinatenvektor von (1, 1, 0, 1). Die Kachelindizes haben Grenzen (2, 3) und die Kachel selbst ist (2, 2) für einen kombinierten Vektor von (2, 3, 2, 2). Der lineare Index mit Kachel für das Element mit dem Index (2, 3) in der logischen Form ist dann

linear_index_with_tile ((2,3), (3,5), (2,2))
= linearer Index ((1,1,0,1), (2,3,2,2))
= linearer Index ((1,1), (2,3)) ≤ 2 ≤ 2 + linearer Index ((0,1), (2,2))
= (1 ≤ 3 + 1) ≤ 2 ≤ 2 + (0 ≤ 2 + 1)
= 17.

Kacheln als Pad-Reshape-Transponierte

Das auf Kacheln basierende Layout funktioniert wie folgt:
Betrachten Sie ein Array von Dimensionen (d n , d n-1 , ..., d1) (d1 ist die kleinste Dimension). Wenn es mit Kacheln der Größe (t n , t n-1 , ..., t 1 ) ausgelegt ist (t 1 ist die kleinste Dimension), kann diese Kachelung im Folgenden anhand der Pad-Reshape-Transponierung beschrieben werden Weg.

  1. Das Array ist aufgefüllt mit (nd n / t n ⌉ t n , ..., ⌈d 1 / t 1 ⌉ t 1 ).
  2. In jede Dimension i wird unterteilt (⌈d i / t i ⌉, t i ), dh das Array wird umgeformt
    (⌈D n / t n ⌉, t n , ..., ⌈ d 1 / t 1 ⌉, t 1 ).
    Es gibt keine physische Layoutänderung in dieser Umformung an sich, daher ist diese Umformung ein Bitcast. Wenn man nicht explizit an eine Kachelung denkt, kann diese Umformung jede Form mit der gleichen Anzahl von Elementen wie die gepolsterte Form ausdrücken. Hier wird beispielhaft gezeigt, wie eine Kachel auf diese Weise ausgedrückt wird.
  3. Eine Transponierung erfolgt durch Verschieben von t n , ..., t 1 in die kleinsten Dimensionen unter Beibehaltung ihrer relativen Reihenfolge, so dass die Reihenfolge der Dimensionen von den wichtigsten zu den kleinsten wird
    (⌈D n / t n ⌉, ..., ⌈d 1 / t 1 ⌉, t n , ..., t 1 ).

Die endgültige Form hat das Präfix
(⌈D n / t n ⌉, ..., ⌈d 1 / t 1 ⌉), das die Anzahl der Kacheln in jeder Dimension beschreibt. Ein Element in dem Array (e n, ..., e 1) in der Endform auf dieses Element abgebildet:
(Ne n / t n ⌋, ..., ⌊e 0 / t 0 ⌋, e n mod t n , ..., e 1 mod t 1 ). Es ist leicht zu erkennen, dass der lineare Index des Elements erwartungsgemäß der obigen Formel folgt.

Wiederholtes Kacheln

Die Kacheln von XLA werden durch wiederholtes Anwenden noch flexibler.

Figur 2

Abbildung 2 zeigt, wie ein Array der Größe 4x8 durch zwei Kachelebenen gekachelt wird (zuerst 2x4, dann 2x1). Wir stellen diese wiederholte Kachelung als (2,4) (2,1) dar. Jede Farbe zeigt eine 2x4-Kachel an und jedes rote Rahmenfeld ist eine 2x1-Kachel. Die Zahlen geben den linearen Index im Speicher dieses Elements im gekachelten Format an. Dieses Format entspricht dem Format, das für BF16 auf TPU verwendet wird, mit der Ausnahme, dass die anfängliche Kachel größer ist, dh die Kachelung ist (8,128) (2,1), wobei der Zweck der zweiten Kachelung durch 2x1 darin besteht, zwei 16-Bit-Werte zu sammeln Bilden Sie einen 32-Bit-Wert auf eine Weise, die mit der Architektur einer TPU übereinstimmt.

Beachten Sie, dass sich eine zweite oder spätere Kachel sowohl auf die Nebenabmessungen innerhalb der Kachel beziehen kann, wodurch nur die Daten innerhalb der Kachel neu angeordnet werden, wie in diesem Beispiel mit (8,128) (2,1), sondern auch auf die Hauptkreuzkachel Abmessungen aus der vorherigen Kachelung.

Dimensionen mit Fliesen kombinieren

Die Kacheln von XLA unterstützen auch das Kombinieren von Dimensionen. Beispielsweise können Dimensionen in F32 [2,7,8,11,10] {4,3,2,1,0} zuerst in F32 [112,110] {1,0} kombiniert werden, bevor sie mit (2,3) gekachelt werden ). Die verwendete Kachel ist (∗, ∗, 2, ∗, 3). Hier bedeutet ein Sternchen in einer Kachel, dass diese Dimension mit der nächst kleineren Dimension kombiniert wird. Mehrere benachbarte Dimensionen können zu einer Dimension zusammengefasst werden. Eine subsumierte Dimension wird durch einen Kachelwert von -1 in dieser Dimension der Kachel dargestellt, der in einer Kachel als Dimensionsgröße ansonsten nicht gültig ist.

Genauer gesagt, wenn die Bemaßung i der Form über ein Sternchen in der Kachel entfernt wird, wird diese Bemaßung vor dem Anwenden der vorherigen Definition der Kachelung sowohl von der zu kachelnden Form als auch vom Kachelvektor entfernt, und was war die Bemaßung i-1? der gebundenen Anordnung der Form ist von d i-1 auf d i d i-1 erhöht. Dieser Schritt wird für jedes Sternchen im Kachelvektor wiederholt.