Эта страница переведена с помощью Cloud Translation API.
Switch to English

Формы и макет

Прототип Shape XLA ( 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 и так далее.

  • Двух-, трех- и четырехмерные массивы часто имеют определенные буквы, связанные с измерениями. Например, для 2D-массива:

    • размер 0: y
    • размер 1: x

    Для 3D-массива:

    • размер 0: z
    • размерность 1: y
    • размер 2: x

    Для 4D-массива:

    • размер 0: p
    • размер 1: z
    • размер 2: y
    • размер 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 мерного массива), причем первое значение является самым второстепенным измерением, до последнего значения, которое является самым главным измерением. Самый второстепенный размер - это размер, который изменяется наиболее быстро при переходе по элементам массива, размещенного в линейной памяти.

Например, рассмотрим следующий 2D-массив размером [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

Этот порядок измерения от меньшего к N-1 от 0 до N-1 сродни старшему столбцу (на уровне 2). Предполагая монотонный порядок размеров, другое имя, которое мы можем использовать для обозначения этого макета в коде, просто «dim 0 is minor».

С другой стороны, если поле minor_to_major в макете равно [1, 0] то макет в линейной памяти будет:

a b c d e f

Порядок измерения от N-1 к большему от 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 в том же каталоге для утилит, которые упрощают создание и управление фигурами и макетами.