Прототип XLA Shape
( xla_data.proto ) описывает ранг, размер и тип данных N-мерного массива (сокращенно массива ).
Терминология, обозначения и соглашения
Ранг массива равен количеству измерений. Истинный ранг массива — это количество измерений, размер которых больше 1.
Измерения нумеруются от
0
доN-1
дляN
мерного массива. Числа размеров являются произвольными для удобства. Порядок этих размерных чисел не подразумевает особого второстепенного/основного порядка в расположении формы. Макет определяется прототипомLayout
.По соглашению размеры перечислены в порядке возрастания номера измерения. Например, для трехмерного массива размером
[A x B x C]
измерение 0 имеет размерA
, измерение 1 имеет размерB
, а измерение 2 имеет размерC
Некоторые утилиты в XLA также поддерживают отрицательную индексацию в стиле Python: измерение -1 — это последнее измерение (эквивалентно
N-1
дляN
мерного массива). Например, для описанного выше трехмерного массива измерение -1 имеет размерC
, измерение -2 имеет размерB
и так далее.Двух-, трех- и четырехмерные массивы часто имеют определенные буквы, связанные с измерениями. Например, для двумерного массива:
- размерность 0:
y
- размер 1:
x
Для 3D-массива:
- размер 0:
z
- размер 1:
y
- размер 2:
x
Для 4D-массива:
- размерность 0:
p
- размер 1:
z
- размер 2:
y
- размер 3:
x
- размерность 0:
Функции в 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-1
до 0
для N
мерного массива сродни старшему по строкам (на уровне 2). Предполагая монотонный порядок размеров, мы можем использовать другой способ обозначения этого макета в коде: «тусклый 0 является основным».
Порядок по умолчанию от младшего к большему
Макетом по умолчанию для вновь созданных фигур является «порядок размеров от основного к младшему» (аналогично основному по строкам на уровне 2).
Заполнение
Заполнение определяется в необязательных padded_dimensions
padding_value
. padded_dimensions
описывает размеры (ширину), до которых дополняется каждое измерение. Если он присутствует, количество элементов в padded_dimensions
должно равняться рангу фигуры.
Например, для массива [2 x 3]
, определенного выше, если padded_dimensions
равен [3, 5]
тогда измерение 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
в одном каталоге для утилит, упрощающих создание фигур и макетов и манипулирование ими.