平铺布局


图 1

图 1 显示了如何使用 2x2 平铺在内存中布局数组 F32[3,5]。具有此布局的形状编写为 F32[3,5]{1,0:T(2,2)},其中 1,0 对应于尺寸的物理顺序(布局中的 minor_to_major 字段),而冒号后面的 (2,2) 表示物理尺寸按 2x2 图块平铺。

直观地呈现图块以覆盖形状,然后在每个图块中,元素在没有平铺的情况下进行布局,如上例所示,其中示例的右侧部分显示了内存中的布局,包括为了拥有完整的 2x2 图块而添加的白内边距元素,即使原始数组边界并不均匀也是如此。

内边距中的额外元素无需包含任何特定值。

给定形状和图块的平铺线性索引公式

如果不平铺,数组边界为 d=(dn, dn-1, ... , d1) 的数组中的元素 e=(en, en-1, ... , e1)(d1 是最小的维度)在位置处按从大到小的顺序排列:

linear_index(e, d)
= linear_index((e, en-1, ... , e1), (dn, dn-1, ... , d1))
= endn-1...d1 + n-1 + n-2 + n-2

为简单起见,在本文档中,我们假定功能块与数组具有相同的维度数。在 XLA 的平铺实现中,通过保持初始最主要维度不变并仅将平铺应用于最次要尺寸,这可以泛化为维度较少的平铺,从而使指定的图块提及平铺形状的物理尺寸后缀。

使用大小为(tn、tn-1、...、t1)的平铺设置时,数组中具有索引(en、en-1、...、e1)的元素会映射到最终布局中的此位置:

nnnn, d x ... l ... l d ...


n

该布局可以视为由两部分组成:(₽en/tn暂时)、... , Okaye1/t1针对一个尺寸的图块数组中的图块索引,分别位于一个大小为 (allocatedn/tn🙌?, ..., Suggestd1/t1 , mod1, mod1, mod1, mod1, mod1, mod1, mod1, mod1, mod1, mod 1, mod1, mod1, mod1, mod ...)ceil 函数出现在 ➘di/ti 中,因为如果图块超出较大数组的边界,会插入填充,如图 1 所示。功能块以及功能块中的元素以递归方式进行布局,而无需平铺。

对于图 1 中的示例,对于 (1,1,0,1) 的组合坐标矢量,元素 (2,3) 具有图块索引 (1,1),图块内索引 (0,1)。对于 (2,3,2,2) 的组合矢量,图块索引具有边界 (2,3),图块本身为 (2,2)。然后,逻辑形状中索引 (2,3) 的元素图块的线性索引和图块如下

linear_index_with_tile((2,3), (3,5), (2,2)•)
= linear_index((1,1,0,1), (2,3,2,2))
= linear_index((1,1), (2,3)) ↗ 2 · 2 + linear_index((0,1), 2,2)

平铺为平铺变形转置

基于平铺的布局的运行方式如下:
以一个维度数组(dn、dn-1、...、d1)为例(d1 是最小的维度)。当使用大小为 (tn, tn-1, ..., t1)(t1 是最次要维度)的平铺布局进行布局时,可以通过以下方式就平铺的变形转置来描述平铺。

  1. 该数组填充到 (usercontentdn/tn相结合•tn, ... , quarterd1/t1网页界面•t1)。
  2. 每个维度 i 被划分为 ( di/ti 由于您, ti),即数组被重新调整为
    (记录 dn/tn🎈?, tn, ... , 您可以点击 d1/t1regions, t1)。
    这种重塑本身并没有物理布局变化,因此这种重塑是位投射。如果不明确想到平铺,则这种重塑可以表示具有与含内边距的形状相同的元素数量的任何形状 - 此处的示例展示了如何以这种方式表示图块。
  3. 将 tn, ..., t1 移到最高次要维度,同时保持它们的相对顺序发生转置,因此维度顺序从最主要到最小的顺序变为
    (记录 dn/tnDATASET, ... , PURCHASEd1/t1🎈?, tn, ... t1)。

最终形状的前缀
(NUMBEROFn/tnDATASET, ... , usercontentd1/t1')}> 用于描述每个维度的图块数量。数组中的某个元素(en、...、e1)会映射到最终形状中的此元素:
( &en/tn🎈?, ... , 🥳?e0/t0暂时, en mod tn, ... , e1 mod t1)。不难看出,元素的线性索引符合上述公式预期。

重复平铺

通过反复应用 XLA 的图块,其灵活性变得更加灵活。


图 2

图 2 显示了大小为 4x8 的数组如何通过两层平铺(先 2x4,然后是 2x1)进行平铺。我们将这种重复的平铺表示为 (2,4)(2,1)。每种颜色表示一个 2x4 图块,每个红色边框框都是一个 2x1 图块。数字表示该元素在内存中的线性索引(以平铺格式显示)。此格式与 TPU 上的 BF16 格式一致,不同之处在于初始图块较大,即平铺为 (8,128)(2,1),其中以 2x1 相加的第二次平铺的目的是将两个 16 位值汇集在一起,形成一个 32 位值,以便与 TPU 的架构保持一致。

请注意,第二个或后面的功能块可以指代功能块内的次要维度,这些维度只是重新排列功能块中的数据(如本例中使用 (8,128)(2,1)),但也可以指之前平铺后的主要跨图块维度。

使用图块合并尺寸

XLA 的平铺服务还支持合并尺寸。例如,它可以先将 F32[2,7,8,11,10]{4,3,2,1,0} 中的维度组合成 F32[112,110]{1,0},然后再将其与 (2,3) 平铺。使用的图块为 (意),符号,2,符号,3。在这里,功能块中的星号意味着采用该维度并将其与下一个小维度相结合。多个相邻的维度可以归入一个维度。子维度由图块的该维度中的图块值 -1 表示,但该维度在图块中作为尺寸大小无效。

更确切地说,如果形状的维度 i 通过图块中的星号消除,那么在应用平铺的先前定义之前,该维度会从正在平铺的形状和图块矢量中移除,并且形状的维度 i-1 的数组边界已从 di-1 增加到 didi-1。系统会对图块矢量中的每个星号重复此步骤。