도형 및 레이아웃

XLA Shape proto(xla_data.proto)는 N차원 배열 (줄여서 배열)의 순위, 크기, 데이터 유형을 설명합니다.

용어, 표기법, 규칙

  • 배열의 순위는 차원의 수와 같습니다. 배열의 실제 순위는 크기가 1보다 큰 차원의 수입니다.

  • 차원은 N 차원 배열에 대해 0부터 N-1까지 번호가 매겨집니다. 측정기준 번호는 편의상 임의의 라벨입니다. 이러한 치수 번호의 순서는 도형의 레이아웃에서 특정한 하위 또는 주요 순서를 의미하지 않습니다. 레이아웃은 Layout proto에 의해 결정됩니다.

  • 일반적으로 측정기준은 차원 수에 따라 오름차순으로 나열됩니다. 예를 들어 크기가 [A x B x C]인 3차원 배열의 경우 차원 0의 크기는 A이고, 차원 1의 크기는 B이며, 차원 2의 크기는 C입니다.

    XLA의 일부 유틸리티는 Python과 유사한 음수 색인 생성도 지원합니다. 차원 -1은 마지막 차원입니다 (N 차원 배열의 경우 N-1와 같음). 예를 들어 위에서 설명한 3차원 배열의 경우 차원 -1의 크기는 C이고 차원 -2의 크기는 B입니다.

  • 2차원 배열, 3차원 배열, 4차원 배열은 특정 문자가 차원과 연결된 경우가 많습니다. 예를 들어 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 proto는 메모리에서 배열이 표시되는 방식을 설명합니다. Layout proto에는 다음 필드가 포함됩니다.

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

소수 간 측정기준 정렬

유일한 필수 입력란은 minor_to_major입니다. 이 필드는 도형 내에서 차원의 작은 순서를 설명합니다. minor_to_major의 값은 배열 차원 (N 차원 배열의 경우 0~N-1)의 순서이며, 첫 번째 값은 최하위 차원부터 가장 큰 차원인 마지막 값까지입니다. 최하위 차원은 선형 메모리에 배치된 배열의 요소를 단계별로 실행할 때 가장 빠르게 변경되는 차원입니다.

예를 들어, 다음과 같이 크기가 [2 x 3]인 2D 배열이 있다고 가정해 보겠습니다.

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)과 비슷합니다. 차원의 단조로운 순서를 가정할 때 코드에서 이 레이아웃을 참조할 수 있는 또 다른 방법은 단순히 '어두운 0은 마이너스'입니다.

반면 레이아웃의 minor_to_major 필드가 [1, 0]이면 선형 메모리의 레이아웃은 다음과 같습니다.

a b c d e f

N 차원 배열에서 N-1부터 0까지의 소차원 순서는 행-메이저 (순위 2)와 유사합니다. 차원의 단조로운 순서를 가정할 때 코드에서 이 레이아웃을 참조할 수 있는 또 다른 방법은 단순히 'dim 0 is major'입니다.

기본 서술형 순서

새로 만든 도형의 기본 레이아웃은 '측정기준 순서는 주-단-순'입니다(순위 2에서 행-메이저와 유사).

패딩

패딩은 선택적 padded_dimensionspadding_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

배열로 색인 생성

index_util.hIndexUtil 클래스는 도형과 레이아웃이 지정된 다차원 색인과 선형 색인 간에 변환하는 유틸리티를 제공합니다. 다차원 색인에는 각 측정기준에 대한 int64 색인이 포함됩니다. 선형 색인은 배열을 보유한 버퍼의 색인을 생성하는 단일 int64 값입니다. 도형과 레이아웃의 생성과 조작을 단순화하는 유틸리티는 동일한 디렉터리에 있는 shape_util.hlayout_util.h를 참고하세요.