다음을 통해 공유


DML_SLICE1_OPERATOR_DESC 구조체(directml.h)

입력 텐서의 단일 하위 영역("조각")을 추출합니다.

입력 창은 조각에서 고려할 입력 텐서의 범위를 설명합니다. 창은 각 차원에 대해 세 개의 값을 사용하여 정의됩니다.

  • 오프셋창의 시작을 차원으로 표시합니다.
  • 크기는 창의 범위를 차원으로 표시합니다. 차원 의 창 끝 은 입니다 offset + size - 1.
  • stride는 차원의 요소를 트래버스하는 방법을 나타냅니다.
    • 보폭의 크기는 창 내에서 복사할 때 진행할 요소 수를 나타냅니다.
    • 보폭이 양수이면 차원의 창 시작 부분에서부터 요소가 복사됩니다.
    • stride가 음수이면 차원의 창 끝에서 시작하여 요소가 복사됩니다.

다음 의사 코드는 입력 창을 사용하여 요소를 복사하는 방법을 보여 줍니다. 차원의 요소가 양수 보폭을 사용하여 처음부터 끝까지 복사되고 음의 보폭으로 처음부터 끝까지 복사되는 방법을 기록해 둡다.

CopyStart = InputWindowOffsets
for dimension i in [0, DimensionCount - 1]:
    if InputWindowStrides[i] < 0:
        CopyStart[i] += InputWindowSizes[i] - 1 // start at the end of the window in this dimension

OutputTensor[OutputCoordinates] = InputTensor[CopyStart + InputWindowStrides * OutputCoordinates]

입력 창은 어떤 차원에서도 비어 있지 않아야 하며, 창이 입력 텐서의 차원 이상으로 확장되어서는 안 됩니다(범위를 벗어난 읽기는 허용되지 않음). 창의 크기와 보폭은 입력 텐서의 각 차원 i 에서 복사할 수 있는 요소 수를 효과적으로 제한합니다.

MaxCopiedElements[i] = 1 + (InputWindowSize[i] - 1) / InputWindowStrides[i]

출력 텐서가 창 내에서 연결할 수 있는 모든 요소를 복사할 필요는 없습니다. 조각은 만큼 유효합니다 1 <= OutputSizes[i] <= MaxCopiedElements[i].

구문

struct DML_SLICE1_OPERATOR_DESC {
  const DML_TENSOR_DESC *InputTensor;
  const DML_TENSOR_DESC *OutputTensor;
  UINT                  DimensionCount;
  const UINT            *InputWindowOffsets;
  const UINT            *InputWindowSizes;
  const INT             *InputWindowStrides;
};

멤버

InputTensor

형식: const DML_TENSOR_DESC*

조각을 추출할 텐서입니다.

OutputTensor

형식: const DML_TENSOR_DESC*

조각화된 데이터 결과를 쓸 텐서입니다.

DimensionCount

형식: UINT

차원 수입니다. 이 필드는 InputWindowOffsets, InputWindowSizesInputWindowStrides 배열의 크기를 결정합니다. 이 값은 입력 및 출력 텐서의 DimensionCount 와 일치해야 합니다. 이 값은 1에서 DML_FEATURE_LEVEL_3_08 사이여야 합니다( 포함). 이전 기능 수준에서는 4 또는 5 값이 필요합니다.

InputWindowOffsets

형식: _Field_size_(DimensionCount) const UINT*

각 차원의 입력 창의 시작 부분(요소)을 포함하는 배열입니다. 배열의 값이 제약 조건을 충족해야 합니다. InputWindowOffsets[i] + InputWindowSizes[i] <= InputTensor.Sizes[i]

InputWindowSizes

형식: _Field_size_(DimensionCount) const UINT*

각 차원의 입력 창 익스텐트(요소)를 포함하는 배열입니다. 배열의 값이 제약 조건을 충족해야 합니다. InputWindowOffsets[i] + InputWindowSizes[i] <= InputTensor.Sizes[i]

InputWindowStrides

형식: _Field_size_(DimensionCount) const UINT*

입력 텐서의 각 차원(요소)을 따라 조각의 보폭을 포함하는 배열입니다. 보폭의 크기는 입력 창 내에서 복사할 때 진행할 요소 수를 나타냅니다. stride의 부호는 창의 시작 부분(양수 보폭) 또는 창 끝(음의 보폭)부터 요소가 복사되는지 여부를 결정합니다. 보폭은 0이 아닐 수 있습니다.

예제

다음 예제에서는 동일한 입력 텐서를 사용합니다.

InputTensor: (Sizes:{1, 1, 4, 4}, DataType:FLOAT32)
[[[[ 1,  2,  3,  4],
   [ 5,  6,  7,  8],
   [ 9, 10, 11, 12],
   [13, 14, 15, 16]]]]

예제 1. 양의 보폭이 있는 스트라이드 슬라이스

InputWindowOffsets = {0, 0, 0, 1}
InputWindowSizes   = {1, 1, 4, 3}
InputWindowStrides = {1, 1, 2, 2}

OutputTensor: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[ 2,  4],
   [10, 12]]]]

복사한 요소는 다음과 같이 계산됩니다.

Output[0,0,0,0] = {0,0,0,1} + {1,1,2,2} * {0,0,0,0} = Input[{0,0,0,1}] = 2
Output[0,0,0,1] = {0,0,0,1} + {1,1,2,2} * {0,0,0,1} = Input[{0,0,0,3}] = 4
Output[0,0,1,0] = {0,0,0,1} + {1,1,2,2} * {0,0,1,0} = Input[{0,0,2,1}] = 10
Output[0,0,1,1] = {0,0,0,1} + {1,1,2,2} * {0,0,1,1} = Input[{0,0,2,3}] = 12

예제 2. 음수 보폭이 있는 스트라이드 조각

InputWindowOffsets = {0, 0, 0, 1}
InputWindowSizes   = {1, 1, 4, 3}
InputWindowStrides = {1, 1, -2, 2}

OutputTensor: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[14, 16],
   [ 6,  8]]]]

음수 창 보폭이 있는 차원은 해당 차원의 입력 창 끝에서 복사를 시작합니다. 창 오프셋에 를 추가하여 InputWindowSize[i] - 1 이 작업을 수행합니다. 양의 보폭이 있는 차원은 에서 InputWindowOffset[i]시작하기만 하면 됩니다.

  • 축 0(+1 창 보폭)이 에서 InputWindowOffsets[0] = 0복사를 시작합니다.
  • 축 1(+1 창 보폭)이 에서 InputWindowOffsets[1] = 0복사를 시작합니다.
  • 축 2(-2 창 보폭)가 에서 InputWindowOffsets[2] + InputWindowSizes[0] - 1 = 0 + 4 - 1 = 3복사를 시작합니다.
  • 축 3(+2 창 보폭)이 에서 InputWindowOffsets[3] = 1복사를 시작합니다.

복사한 요소는 다음과 같이 계산됩니다.

Output[0,0,0,0] = {0,0,3,1} + {1,1,-2,2} * {0,0,0,0} = Input[{0,0,3,1}] = 14
Output[0,0,0,1] = {0,0,3,1} + {1,1,-2,2} * {0,0,0,1} = Input[{0,0,3,3}] = 16
Output[0,0,1,0] = {0,0,3,1} + {1,1,-2,2} * {0,0,1,0} = Input[{0,0,1,1}] = 6
Output[0,0,1,1] = {0,0,3,1} + {1,1,-2,2} * {0,0,1,1} = Input[{0,0,1,3}] = 8

설명

이 연산자는 DML_SLICE_OPERATOR_DESC 비슷하지만 두 가지 중요한 방법으로 다릅니다.

  • 조각 진행은 음수일 수 있으므로 차원을 따라 값을 반전할 수 있습니다.
  • 입력 창 크기가 반드시 출력 텐서 크기와 동일하지는 않습니다.

가용성

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

텐서 제약 조건

InputTensorOutputTensor 에는 동일한 DataTypeDimensionCount가 있어야 합니다.

텐서 지원

DML_FEATURE_LEVEL_4_1 이상

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

DML_FEATURE_LEVEL_2_1 이상

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

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 10 빌드 20348
지원되는 최소 서버 Windows 10 빌드 20348
머리글 directml.h