Shapes and Layout(形状和布局)

XLA Shapeproto(xla_data.proto)描述了N维数组(简称数组)的秩,大小和数据类型。

术语,表示法和惯例

  • 数组的排名等于维数。数组的真实等级是尺寸大于1的维数。
  • 尺寸从0最多编号到N-1一个N尺寸数组。为方便起见,尺寸编号是任意标签。这些尺寸编号的顺序并不意味着形状布局中的特定次要/主要顺序。布局由Layout原型确定。
  • 按照惯例,维度按维度编号的升序排列。例如,对于尺寸为3维的数组[A x B x C],尺寸0具有尺寸A,尺寸1具有尺寸B,尺寸2具有尺寸C。XLA中的一些实用程序也支持负向索引,类似于Python; 维-1是最后一维(相当于N-1一个N二维阵列)。例如,对于上述的三维数组,尺寸-1具有尺寸C,尺寸-2具有尺寸B等等。
  • 二维,三维和四维阵列通常具有与维度相关的特定字母。例如,对于二维数组:
- dimension 0: `y` 
- dimension 1: `x` 

对于3D阵列:

- dimension 0: `z` 
- dimension 1: `y` 
- dimension 2: `x` 

对于4D阵列:

- dimension 0: `p` 
- dimension 1: `z` 
- dimension 2: `y` 
- dimension 3: `x` 
  • XLA API中的功能按尺寸编号的顺序递增。这与传递尺寸时使用的顺序相匹配initializer_list; 例如

ShapeUtil::MakeShape(F32, {A, B, C, D})

将创建尺寸大小数组由序列组成的形状[A, B, C, D]

布局

所述Layout原描述的阵列是如何在存储器中表示。该Layout原包括以下字段:

message Layout {
  repeated int64 minor_to_major = 1;
  repeated int64 padded_dimensions = 2;
  optional PaddingValue padding_value = 3;
}

次要到主要的维度排序

唯一必需的字段是minor_to_major。此字段描述形状内尺寸从小到大的顺序。在值minor_to_major是阵列(的尺寸的排序0,以N-1用于N维阵列)与所述第一值是最高次要尺寸高达的最后一个值是最-主要尺寸。最小维度是在逐步排列在线性内存中的阵列元素时变化最快的维度。

例如,考虑下面的二维数组大小[2 x 3]

a b c
d e f

这里尺寸0是尺寸2,尺寸1是尺寸3.如果minor_to_major布局中的字段是[0, 1]尺寸,那么尺寸0是最小尺寸,尺寸1是最大尺寸。这对应于线性内存中的以下布局:

a d b e c f

这个由0到 N-1 的小到大尺寸顺序类似于列优先 (在等级 2)。假设维度的单调排序, 我们可以在代码中引用此布局的另一个名称是 "dim 0 是次要的"。

另一方面,如果minor_to_major布局中的字段是[1, 0]线性内存中的布局,则:

a b c d e f

N 维数组的 N-1 到0的小到大维度顺序类似于行少校 (在秩 2)。假设维度的单调排序, 我们在代码中引用这个布局的另一个名称是简单的 "暗淡0是主要的"。

默认的小到大排序

新创建的形状的默认布局是“维度顺序是主要到次要的”(类似于行列2级)。

填充

填充在可选的定义padded_dimensionspadding_value领域。该字段padded_dimensions描述每个维度被填充的大小(宽度)。如果存在,则元素的数量padded_dimensions必须等于形状的等级。

例如,如果给定了[2 x 3]上面定义的数组,则如果padded_dimension[3, 5]0 ,则将维度0填充为3的宽度,将维度1填充为5的宽度。线性内存中的布局(假设填充值为0并且列主布局)是:

a d 0 b e 0 c f 0 0 0 0 0 0 0

这相当于具有相同次要到主要维度顺序的以下数组的布局:

a b c 0 0
d e f 0 0
0 0 0 0 0

索引到数组中

IndexUtil类在index_util.h提供工具,用于给定的形状和布局的多维索引和线性指数之间的转换。多维指标包括int64每个维度的指标。线性索引是一个int64索引到包含数组的缓冲区中的单个值。查看shape_util.hlayout_util.h在同一目录中找到可简化形状和布局的创建和操作的实用程序。

扫码关注云+社区

领取腾讯云代金券