다음을 통해 공유


DML_GATHER_OPERATOR_DESC 구조체(directml.h)

IndicesTensor를 사용하여 인덱스를 다시 매핑하여 Axis를 따라 입력 텐서에서 요소를 수집합니다. 이 연산자는 다음 의사 코드를 수행합니다. 여기서 "..." 는 축 및 인덱스 차원 수에 의해 결정되는 정확한 동작을 사용하여 일련의 좌표를 나타냅니다.

output[...] = input[..., indices[...], ...]

구문

struct DML_GATHER_OPERATOR_DESC {
  const DML_TENSOR_DESC *InputTensor;
  const DML_TENSOR_DESC *IndicesTensor;
  const DML_TENSOR_DESC *OutputTensor;
  UINT                  Axis;
  UINT                  IndexDimensions;
};

멤버

InputTensor

형식: const DML_TENSOR_DESC*

읽을 텐서입니다.

IndicesTensor

형식: const DML_TENSOR_DESC*

인덱스를 포함하는 텐서입니다. 이 텐서의 DimensionCountInputTensor.DimensionCount와 일치해야 합니다.

부터 이 연산자는 이 텐서에 DML_FEATURE_LEVEL_3_0서명된 정수 계열 형식을 사용할 때 음수 인덱스 값을 지원합니다. 음수 인덱스는 축 차원의 끝을 기준으로 하는 것으로 해석됩니다. 예를 들어 -1 인덱스는 해당 차원의 마지막 요소를 참조합니다.

잘못된 인덱스는 잘못된 출력을 생성하지만 오류가 발생하지 않으며 모든 읽기는 입력 텐서의 메모리 내에서 안전하게 고정됩니다.

OutputTensor

형식: const DML_TENSOR_DESC*

결과를 쓸 텐서입니다. 이 텐서의 DimensionCountDataTypeInputTensor.DimensionCount와 일치해야 합니다. 예상 OutputTensor.Sizes는 IndicesTensor.Sizes가 삽입된 현재 에서 분할된 InputTensor.Sizes 선행 및 후행 세그먼트의 연결입니다.

OutputTensor.Sizes = {
    InputTensor.Sizes[0..Axis],
    IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndexDimensions) .. IndicesTensor.DimensionCount],
    InputTensor.Sizes[(Axis+1) .. InputTensor.DimensionCount]
}

입력 크기의 선행 1 값이 잘리면 출력 DimensionCount가 오버플로되도록 차원이 오른쪽 맞춤됩니다.

이 텐서의 관련 차원 수는 IndexDimensionsInputTensor원래 순위에 따라 달라집니다. 원래 순위는 선행 차원이 있는 패딩 이전의 차원 수입니다. 출력의 관련 차원 수는 InputTensor + IndexDimensions - 1의 원래 순위로 계산할 수 있습니다. 이 값은 OutputTensorDimensionCount보다 작거나 같아야 합니다.

Axis

형식: UINT

에 대해 수집할 InputTensor 의 축 차원입니다. 범위 [0, *InputTensor.DimensionCount*)는 입니다.

IndexDimensions

형식: UINT

[0, IndicesTensor.DimensionCount)에 이르는 관련 없는 선행 차원을 무시한 후 내 IndicesTensor 의 실제 인덱스 차원 수입니다. 예를 들어 지정된 IndicesTensor.Sizes = { 1, 1, 4, 6 }IndexDimensions = 3의 실제 의미 있는 인덱스는 입니다.{ 1, 4, 6 }

예제 1. 1D 다시 매핑

Axis: 0
IndexDimensions: 1

InputTensor: (Sizes:{4}, DataType:FLOAT32)
    [11,12,13,14]

IndicesTensor: (Sizes:{5}, DataType:UINT32)
    [3,1,3,0,2]

// output[x] = input[indices[x]]
OutputTensor: (Sizes:{5}, DataType:FLOAT32)
    [14,12,14,11,13]

예제 2. 2D 출력, 1D 인덱스, 축 0, 행 연결

Axis: 0
IndexDimensions: 1

InputTensor: (Sizes:{3,2}, DataType:FLOAT32)
    [[1,2], // row 0
     [3,4], // row 1
     [5,6]] // row 2

IndicesTensor: (Sizes:{1, 4}, DataType:UINT32)
    [[0,
      1,
      1,
      2]]

// output[y, x] = input[indices[y], x]
OutputTensor: (Sizes:{4,2}, DataType:FLOAT32)
    [[1,2], // input row 0
     [3,4], // input row 1
     [3,4], // input row 1
     [5,6]] // input row 2

예제 3. 2D, 축 1, 열 교환

Axis: 1
IndexDimensions: 2

InputTensor: (Sizes:{3,2}, DataType:FLOAT32)
    [[1,2],
     [3,4],
     [5,6]]

IndicesTensor: (Sizes:{1, 2}, DataType:UINT32)
    [[1,0]]

// output[y, x] = input[y, indices[x]]
OutputTensor: (Sizes:{3,2}, DataType:FLOAT32)
    [[2,1],
     [4,3],
     [6,5]]

예제 4. 2D, 축 1, 중첩된 인덱스

Axis: 2
IndexDimensions: 2

InputTensor: (Sizes:{1, 3,3}, DataType:FLOAT32)
    [ [[1,2,3],
       [4,5,6],
       [7,8,9]] ]

IndicesTensor: (Sizes:{1, 1,2}, DataType:UINT32)
    [ [[0,2]] ]

// output[z, y, x] = input[z, indices[y, x]]
OutputTensor: (Sizes:{3,1,2}, DataType:FLOAT32)
    [[[1,3]],
     [[4,6]],
     [[7,9]]]

예제 5. 2D, 축 0, 중첩된 인덱스

Axis: 1
IndexDimensions: 2

InputTensor: (Sizes:{1, 3,2}, DataType:FLOAT32)
    [ [[1,2],
       [3,4],
       [5,6]] ]

IndicesTensor: (Sizes:{1, 2,2}, DataType:UINT32)
    [ [[0,1],
       [1,2]] ]

// output[z, y, x] = input[indices[z, y], x]
OutputTensor: (Sizes:{2,2,2}, DataType:FLOAT32)
    [[[1,2], [3,4]],
     [[3,4], [5,6]]]

가용성

이 연산자는 에서 DML_FEATURE_LEVEL_1_0도입되었습니다.

텐서 제약 조건

  • IndicesTensor, InputTensorOutputTensor 에는 동일한 DimensionCount가 있어야 합니다.
  • InputTensorOutputTensor 에는 동일한 DataType이 있어야 합니다.

텐서 지원

DML_FEATURE_LEVEL_4_1 이상

텐서 종류 지원되는 차원 수 지원되는 데이터 형식
InputTensor 입력 1-8 FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8
IndicesTensor 입력 1-8 INT64, INT32, UINT64, UINT32
OutputTensor 출력 1-8 FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8

DML_FEATURE_LEVEL_3_0 이상

텐서 종류 지원되는 차원 수 지원되는 데이터 형식
InputTensor 입력 1-8 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8
IndicesTensor 입력 1-8 INT64, INT32, UINT64, UINT32
OutputTensor 출력 1-8 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8

DML_FEATURE_LEVEL_2_1 이상

텐서 종류 지원되는 차원 수 지원되는 데이터 형식
InputTensor 입력 4 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8
IndicesTensor 입력 4 Uint32
OutputTensor 출력 4 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8

DML_FEATURE_LEVEL_1_0 이상

텐서 종류 지원되는 차원 수 지원되는 데이터 형식
InputTensor 입력 4 FLOAT32, FLOAT16
IndicesTensor 입력 4 Uint32
OutputTensor 출력 4 FLOAT32, FLOAT16

요구 사항

   
머리글 directml.h