도형 및 레이아웃

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까지의 이 소차원 순서는 column-major(순위 2)와 비슷합니다. 차원의 단조로운 순서를 가정할 때 코드에서 이 레이아웃을 언급할 수 있는 또 다른 방법은 단순히 'dim 0은 마이너다'입니다.

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

a b c d e f

N 차원 배열에서 N-1에서 0까지 음차 차원 순서는 행-주 차원 (순위 2)과 비슷합니다. 차원을 단조롭게 정렬한다고 가정할 때 코드에서 이 레이아웃을 언급할 수 있는 또 다른 방법은 'dim 0 is large'입니다.

기본 소대장 순서

새로 만든 Shapes의 기본 레이아웃은 '크기 순서는 장차-부'입니다(순위 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를 참고하세요.