DML_GATHER_ND1_OPERATOR_DESC 구조체(directml.h)
인덱스 텐서를 사용하여 입력 텐서에서 요소를 수집하여 인덱스를 입력의 전체 하위 블록에 다시 매핑합니다. 이 연산자는 다음 의사 코드를 수행합니다. 여기서 "..." 는 일련의 좌표를 나타내며, 정확한 동작은 일괄 처리, 입력 및 인덱스 차원 수에 따라 달라집니다.
output[batch, ...] = input[batch, indices[batch, ...], ...]
구문
struct DML_GATHER_ND1_OPERATOR_DESC {
const DML_TENSOR_DESC *InputTensor;
const DML_TENSOR_DESC *IndicesTensor;
const DML_TENSOR_DESC *OutputTensor;
UINT InputDimensionCount;
UINT IndicesDimensionCount;
UINT BatchDimensionCount;
};
멤버
InputTensor
형식: const DML_TENSOR_DESC*
읽을 텐서입니다.
IndicesTensor
형식: const DML_TENSOR_DESC*
인덱스를 포함하는 텐서입니다. 이 텐서의 DimensionCount 는 InputTensor.DimensionCount와 일치해야 합니다. IndicesTensor의 마지막 차원은 실제로 인덱스 튜플당 좌표 수이며 InputTensor.DimensionCount를 초과할 수 없습니다. 예를 들어 IndicesDimensionCount = 3이 있는 Sizes{1,4,5,2}
의 인덱스 텐서는 InputTensor로 인덱싱하는 2좌표 튜플의 4x5 배열을 의미합니다.
부터 이 연산자는 이 텐서에 DML_FEATURE_LEVEL_3_0
서명된 정수 계열 형식을 사용할 때 음수 인덱스 값을 지원합니다. 음수 인덱스는 해당 차원의 끝을 기준으로 하는 것으로 해석됩니다. 예를 들어 -1 인덱스는 해당 차원의 마지막 요소를 참조합니다.
OutputTensor
형식: const DML_TENSOR_DESC*
결과를 쓸 텐서입니다. 이 텐서의 DimensionCount 및 DataType 은 InputTensor.DimensionCount와 일치해야 합니다. 예상 OutputTensor.Sizes 는 IndicesTensor.Sizes 선행 세그먼트 및 InputTensor.Sizes 후행 세그먼트의 연결이며 다음을 생성합니다.
indexTupleSize = IndicesTensor.Sizes[IndicesTensor.DimensionCount - 1]
OutputTensor.Sizes = {
1...,
IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndicesDimensionCount) .. (IndicesTensor.DimensionCount - 1)],
InputTensor.Sizes[(InputTensor.DimensionCount - indexTupleSize) .. InputTensor.DimensionCount]
}
OutputTensor.DimensionCount를 충족하는 데 필요한 경우 앞에 선행 1 값이 추가되어 차원이 오른쪽 맞춤됩니다.
예를 들면 다음과 같습니다.
InputTensor.Sizes = {3,4,5,6,7}
InputDimensionCount = 5
IndicesTensor.Sizes = {1,1, 1,2,3}
IndicesDimensionCount = 3 // can be thought of as a {1,2} array of 3-coordinate tuples
// The {1,2} comes from the indices tensor (ignoring last dimension which is the tuple size),
// and the {6,7} comes from input tensor, ignoring the first 3 dimensions
// since the index tuples are 3 elements (from the indices tensor last dimension).
OutputTensor.Sizes = {1, 1,2,6,7}
InputDimensionCount
형식: UINT
관련 없는 선행 차원(범위[1, *InputTensor.DimensionCount*]
)을 무시한 후 InputTensor 내의 실제 입력 차원 수입니다. 예를 들어 InputTensor.Sizes = {1,1,4,6}
및 InputDimensionCount
= 3이 지정된 경우 실제 의미 있는 인덱스는 입니다 {1,4,6}
.
IndicesDimensionCount
형식: UINT
[1, IndicesTensor.DimensionCount ]에 이르는 관련 없는 선행 차원을 무시한 후 IndicesTensor 내의 실제 인덱스 차원 수입니다. 예를 들어 IndicesTensor.Sizes = {1,1,4,6}
및 IndicesDimensionCount = 3이 지정된 경우 실제 의미 있는 인덱스는 입니다 {1,4,6}
.
BatchDimensionCount
형식: UINT
[0, InputTensor.DimensionCount) 및 [0, IndicesTensor.DimensionCount) 내의 독립적인 일괄 처리로 간주되는 각 텐서(InputTensor, IndicesTensor, OutputTensor) 내의 차원 수입니다. 일괄 처리 수는 0일 수 있으며 이는 단일 일괄 처리를 의미합니다. 예를 들어 IndicesTensor.Sizes = {1,3,4,5,6,7}
및 IndicesDimensionCount = 5 및 BatchDimensionCount
= 2가 지정된 경우 일괄 처리 {3,4}
및 의미 있는 인덱스가 {5,6,7}
있습니다.
설명
DML_GATHER_ND1_OPERATOR_DESCBatchDimensionCount를 추가하며 BatchDimensionCount = 0인 경우 DML_GATHER_ND_OPERATOR_DESC 동일합니다.
예
예제 1. 1D 다시 매핑
InputDimensionCount: 2
IndicesDimensionCount: 2
BatchDimensionCount: 0
InputTensor: (Sizes:{2,2}, DataType:FLOAT32)
[[0,1],[2,3]]
IndicesTensor: (Sizes:{2,1}, DataType:UINT32)
[[1],[0]]
// output[y, x] = input[indices[y], x]
OutputTensor: (Sizes:{2,2}, DataType:FLOAT32)
[[2,3],[0,1]]
예제 2. 일괄 처리 수를 사용하여 2D 다시 매핑
InputDimensionCount: 3
IndicesDimensionCount: 3
BatchDimensionCount: 1
// 3 batches.
InputTensor: (Sizes:{1, 3,2,2}, DataType:FLOAT32)
[
[[[0,1],[2,3]], // batch 0
[[4,5],[6,7]], // batch 1
[[8,9],[10,11]]] // batch 2
]
// A 3x2 array of 2D tuples indexing into InputTensor.
// e.g. a tuple of <1,0> in batch 1 corresponds to input value 6.
IndicesTensor: (Sizes:{1, 3,2,2}, DataType:UINT32)
[
[[[0,0],[1,1]],
[[1,1],[0,0]],
[[0,1],[1,0]]]
]
// output[batch, x] = input[batch, indices[batch, x, 0], indices[batch, x, 1]]
OutputTensor: (Sizes:{1,1, 3,2}, DataType:FLOAT32)
[[
[[0,3],
[7,4],
[9,10]]
]]
가용성
이 연산자는 에서 DML_FEATURE_LEVEL_3_0
도입되었습니다.
텐서 제약 조건
- IndicesTensor, InputTensor 및 OutputTensor 에는 동일한 DimensionCount가 있어야 합니다.
- InputTensor 및 OutputTensor 에는 동일한 DataType이 있어야 합니다.
텐서 지원
DML_FEATURE_LEVEL_4_1 이상
텐서 | Kind | 지원되는 차원 수 | 지원되는 데이터 형식 |
---|---|---|---|
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 이상
텐서 | Kind | 지원되는 차원 수 | 지원되는 데이터 형식 |
---|---|---|---|
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 |
요구 사항
지원되는 최소 클라이언트 | Windows 10 빌드 20348 |
지원되는 최소 서버 | Windows 10 빌드 20348 |
머리글 | directml.h |