Формы и расположение

Прототип XLA ShapeProto ( xla_data.proto ) описывает количество измерений, размер и тип данных N-мерного массива (сокращенно массив ).

Терминология, обозначения и соглашения

  • Истинное количество измерений массива — это количество измерений, размер которых больше 1.

  • Измерения нумеруются от 0 до N-1 для N мерного массива. Размер измерения представляет собой неотрицательное целое число. В частности, допустим размер 0. Числа размеров являются произвольными для удобства. Порядок этих размерных чисел не подразумевает особого второстепенного/основного порядка в расположении формы. Макет определяется прототипом LayoutProto .

  • По соглашению размеры перечислены в порядке возрастания номера измерения. Например, для трехмерного массива размером [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
  • Функции в XLA API, которые принимают измерения, делают это в порядке возрастания номера измерения. Это соответствует порядку, используемому при передаче измерений в качестве initializer_list ; например

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

    создаст фигуру, массив размеров размеров которой состоит из последовательности [A, B, C, D] .

Макет

Прототип LayoutProto описывает, как массив представлен в памяти. Он включает в себя следующие поля:

message LayoutProto {
  repeated int64 minor_to_major;
  int64 tail_padding_alignment_in_elements;
  ...
}

Упорядочение размеров от младшего к старшему

Единственное обязательное поле — 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 сродни основному столбцу (для двумерных измерений). Предполагая монотонный порядок размеров, мы можем использовать другой способ обозначения этого макета в коде: «dim 0 — минор».

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

a b c d e f

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

Порядок по умолчанию от младшего к большему

Макетом по умолчанию для вновь созданных фигур является «порядок размеров от большего к меньшему» (т.е. [N-1, ..., 0] ).

Заполнение

Поле tail_padding_alignment_in_elements определяет выравнивание мозаичного массива по количеству элементов. После применения мозаики дополненные элементы будут добавляться в конце макета до тех пор, пока общее количество элементов не станет кратным этому значению.

Индексирование в массивы

Класс IndexUtil в index_util.h предоставляет утилиты для преобразования многомерных индексов в линейные индексы с учетом формы и макета. Многомерные индексы включают индекс int64 для каждого измерения. Линейные индексы — это одно значение int64 , которое индексируется в буфер, содержащий массив. См. shape_util.h и layout_util.h в одном каталоге для утилит, упрощающих создание фигур и макетов и манипулирование ими.