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*
인덱스를 포함하는 텐서입니다. 이 텐서의 DimensionCount 는 InputTensor.DimensionCount와 일치해야 합니다.
부터 이 연산자는 이 텐서에 DML_FEATURE_LEVEL_3_0
서명된 정수 계열 형식을 사용할 때 음수 인덱스 값을 지원합니다. 음수 인덱스는 축 차원의 끝을 기준으로 하는 것으로 해석됩니다. 예를 들어 -1 인덱스는 해당 차원의 마지막 요소를 참조합니다.
잘못된 인덱스는 잘못된 출력을 생성하지만 오류가 발생하지 않으며 모든 읽기는 입력 텐서의 메모리 내에서 안전하게 고정됩니다.
OutputTensor
형식: const DML_TENSOR_DESC*
결과를 쓸 텐서입니다. 이 텐서의 DimensionCount 및 DataType 은 InputTensor.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가 오버플로되도록 차원이 오른쪽 맞춤됩니다.
이 텐서의 관련 차원 수는 IndexDimensions 및 InputTensor의 원래 순위에 따라 달라집니다. 원래 순위는 선행 차원이 있는 패딩 이전의 차원 수입니다. 출력의 관련 차원 수는 InputTensor + IndexDimensions - 1의 원래 순위로 계산할 수 있습니다. 이 값은 OutputTensor의 DimensionCount보다 작거나 같아야 합니다.
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
, InputTensor 및 OutputTensor 에는 동일한 DimensionCount가 있어야 합니다.- InputTensor 및 OutputTensor 에는 동일한 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 |