次の方法で共有


DML_SLICE1_OPERATOR_DESC構造体 (directml.h)

入力テンソルの 1 つのサブ領域 ("スライス") を抽出します。

入力ウィンドウには、スライスで考慮する入力テンソルの境界が記述されます。 ウィンドウは、ディメンションごとに 3 つの値を使用して定義されます。

  • オフセットは、寸法内のウィンドウの先頭を示します。
  • サイズは、ディメンション内のウィンドウの範囲を示します。 ディメンション 内のウィンドウの末尾 は です offset + size - 1
  • ストライドは、ディメンション内の要素を走査する方法を示します。
    • ストライドの大きさは、ウィンドウ内でコピーするときに進める要素の数を示します。
    • ストライドが正の場合は、ディメンションのウィンドウの 先頭 から要素がコピーされます。
    • ストライドが負の場合は、ディメンションのウィンドウの 末尾 から要素がコピーされます。

次の擬似コードは、入力ウィンドウを使用して要素をコピーする方法を示しています。 ディメンション内の要素が最初から最後まで正のストライドでコピーされ、最後から負のストライドで始まるまでコピーされる方法に注意してください。

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

ディメンションの数。 このフィールドは、 InputWindowOffsetsInputWindowSizes、および InputWindowStrides 配列のサイズを 決定します。 この値は、入力テンソルと出力テンソルの DimensionCount と一致する必要があります。 この値は、1 から 8 DML_FEATURE_LEVEL_3_0までの範囲で指定する必要があります。それ以前の機能レベルでは、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*

入力テンソルの各次元に沿ったスライスのストライドを要素単位で含む配列。 ストライドの大きさは、入力ウィンドウ内でコピーするときに進める要素の数を示します。 ストライドの符号は、ウィンドウの先頭 (正のストライド) またはウィンドウの終わり (負のストライド) から要素をコピーするかどうかを決定します。 ストライドは 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に似ていますが、2 つの重要な点で異なります。

  • スライスのストライドは負の値になることがあります。これにより、ディメンションに沿って値を反転できます。
  • 入力ウィンドウのサイズは、必ずしも出力テンソル サイズと同じとは限りません。

可用性

この演算子は で DML_FEATURE_LEVEL_2_1導入されました。

テンソル制約

InputTensorOutputTensor には、同じ DataTypeDimensionCount が必要です。

Tensor のサポート

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
Header directml.h