Shapes and Layout(形状和布局)
形状和布局
XLA Shape
proto(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_dimensions
和padding_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.h
并layout_util.h
在同一目录中找到可简化形状和布局的创建和操作的实用程序。