DML_BUFFER_TENSOR_DESC
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| DataType | DML_TENSOR_DATA_TYPE | 4 | +0 | +0 | テンソル内の値の型です。 |
| Flags | DML_TENSOR_FLAGS | 4 | +4 | +4 | テンソルの追加オプションを指定します。 |
| DimensionCount | DWORD | 4 | +8 | +8 | テンソルの次元数です。このメンバーは、Sizes 配列および Strides 配列 (指定されている場合) のサイズを決定します。DirectML では、次元数は演算子に応じて 1 から 8 までの範囲を取ります。ほとんどの演算子は少なくとも 4 次元をサポートします。 |
| Sizes | DWORD* | 8/4 | +16 | +12 | テンソルの各次元のサイズ (要素単位) です。いずれかの次元に 0 のサイズを指定することは無効であり、エラーになります。軸が意味を持つ演算子 (たとえば、バッチ、チャネル、深さ、高さ、幅) の場合、Sizes メンバーは、DimensionCount が 4 のときは常に {N, C, H, W} の順で、5 のときは常に {N, C, D, H, W} の順で指定します。それ以外の場合、次元には通常特別な意味はありません。 |
| Strides | DWORD* | 8/4 | +24 | +16 | 省略可能です。その次元における次の要素に到達するために線形にたどる要素数 (バイト数ではありません) を決定します。たとえば、次元 1 のストライドが 5 である場合、バッファーを線形にたどったときのその次元における要素 (n) と要素 (n+1) の距離は 5 要素です。軸が意味を持つ演算子 (たとえば、バッチ、チャネル、深さ、高さ、幅) の場合、Strides メンバーは、DimensionCount が 4 のときは常に {N, C, H, W} の順で、5 のときは常に {N, C, D, H, W} の順で指定します。 Strides は、ブロードキャスト (ストライドに 0 を指定する) やパディング (たとえば、行の物理的なサイズより大きいストライドを使用して行の末尾を埋める) を表現するために使用できます。 Strides を指定しない場合、テンソルの各次元は追加のパディングなしで連続的に詰められているものとみなされます。 |
| TotalTensorSizeInBytes | ULONGLONG | 8 | +32 | +24 | このテンソルを格納するバッファーの最小サイズをバイト単位で定義します。TotalTensorSizeInBytes は、テンソルのサイズ、ストライド、およびデータ型から導かれる暗黙の最小サイズ以上でなければなりません。暗黙の最小サイズは、DMLCalcBufferTensorSize ユーティリティ フリー関数を呼び出して計算できます。 暗黙の最小サイズよりも大きい TotalTensorSizeInBytes を指定すると、テンソル データの末尾以降に十分なパディングが定義される場合に DirectML が境界チェックを省略できることがあり、追加の最適化が可能になる場合があります。 このテンソルをバインドするとき、バッファー範囲のサイズは TotalTensorSizeInBytes 以上でなければなりません。出力テンソルの場合、これは TotalTensorSizeInBytes 内の任意のメモリへの書き込みを DirectML に許可するという追加の効果があります。つまり、アプリケーションは、TotalTensorSizeInBytes の範囲内にある出力テンソル内のパディング バイトが DirectML によって保持されると想定してはなりません。 バッファー テンソルの合計サイズは (2^32 - 1) 要素を超えることはできません。たとえば、FLOAT32 テンソルの場合は 16GB です。 |
| GuaranteedBaseOffsetAlignment | DWORD | 4 | +40 | +32 | 省略可能です。このテンソルを格納するバッファー範囲の基準オフセットについて、保証される最小のアラインメントをバイト単位で定義します。最小のアラインメントを保証しない場合は 0 を指定します。指定する場合、この値は要素サイズ以上の 2 のべき乗でなければなりません。 このテンソルをバインドするとき、バッファーの先頭からのバッファー範囲のオフセット (バイト単位) は、GuaranteedBaseOffsetAlignment が指定されている場合はその倍数でなければなりません。 バッファー テンソルのアラインメントは常に最小 16 バイトです。ただし、GuaranteedBaseOffsetAlignment により大きい値を指定すると、アラインメントが大きいほどベクトル化されたロード/ストア命令を使用できるため、DirectML がより良いパフォーマンスを達成できる場合があります。 このメンバーは省略可能ですが、パフォーマンスの観点から、可能な場合はテンソルを 32 バイト以上の境界にアラインすることをお勧めします。 |
公式ドキュメント
Direct3D 12 バッファーリソースに格納されるテンソルを記述します。対応するテンソルの型は DML_TENSOR_TYPE_BUFFER で、対応するバインドの型は DML_BINDING_TYPE_BUFFER です。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// DML_BUFFER_TENSOR_DESC (x64 48 / x86 40 バイト)
typedef struct DML_BUFFER_TENSOR_DESC {
DML_TENSOR_DATA_TYPE DataType;
DML_TENSOR_FLAGS Flags;
DWORD DimensionCount;
DWORD* Sizes;
DWORD* Strides;
ULONGLONG TotalTensorSizeInBytes;
DWORD GuaranteedBaseOffsetAlignment;
} DML_BUFFER_TENSOR_DESC;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DML_BUFFER_TENSOR_DESC
{
public int DataType;
public int Flags;
public uint DimensionCount;
public IntPtr Sizes;
public IntPtr Strides;
public ulong TotalTensorSizeInBytes;
public uint GuaranteedBaseOffsetAlignment;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DML_BUFFER_TENSOR_DESC
Public DataType As Integer
Public Flags As Integer
Public DimensionCount As UInteger
Public Sizes As IntPtr
Public Strides As IntPtr
Public TotalTensorSizeInBytes As ULong
Public GuaranteedBaseOffsetAlignment As UInteger
End Structureimport ctypes
from ctypes import wintypes
class DML_BUFFER_TENSOR_DESC(ctypes.Structure):
_fields_ = [
("DataType", ctypes.c_int),
("Flags", ctypes.c_int),
("DimensionCount", wintypes.DWORD),
("Sizes", ctypes.c_void_p),
("Strides", ctypes.c_void_p),
("TotalTensorSizeInBytes", ctypes.c_ulonglong),
("GuaranteedBaseOffsetAlignment", wintypes.DWORD),
]#[repr(C)]
pub struct DML_BUFFER_TENSOR_DESC {
pub DataType: i32,
pub Flags: i32,
pub DimensionCount: u32,
pub Sizes: *mut core::ffi::c_void,
pub Strides: *mut core::ffi::c_void,
pub TotalTensorSizeInBytes: u64,
pub GuaranteedBaseOffsetAlignment: u32,
}import "golang.org/x/sys/windows"
type DML_BUFFER_TENSOR_DESC struct {
DataType int32
Flags int32
DimensionCount uint32
Sizes uintptr
Strides uintptr
TotalTensorSizeInBytes uint64
GuaranteedBaseOffsetAlignment uint32
}type
DML_BUFFER_TENSOR_DESC = record
DataType: Integer;
Flags: Integer;
DimensionCount: DWORD;
Sizes: Pointer;
Strides: Pointer;
TotalTensorSizeInBytes: UInt64;
GuaranteedBaseOffsetAlignment: DWORD;
end;const DML_BUFFER_TENSOR_DESC = extern struct {
DataType: i32,
Flags: i32,
DimensionCount: u32,
Sizes: ?*anyopaque,
Strides: ?*anyopaque,
TotalTensorSizeInBytes: u64,
GuaranteedBaseOffsetAlignment: u32,
};type
DML_BUFFER_TENSOR_DESC {.bycopy.} = object
DataType: int32
Flags: int32
DimensionCount: uint32
Sizes: pointer
Strides: pointer
TotalTensorSizeInBytes: uint64
GuaranteedBaseOffsetAlignment: uint32struct DML_BUFFER_TENSOR_DESC
{
int DataType;
int Flags;
uint DimensionCount;
void* Sizes;
void* Strides;
ulong TotalTensorSizeInBytes;
uint GuaranteedBaseOffsetAlignment;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; DML_BUFFER_TENSOR_DESC サイズ: 40 バイト(x86)
dim st, 10 ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; DataType : DML_TENSOR_DATA_TYPE (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; Flags : DML_TENSOR_FLAGS (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; DimensionCount : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; Sizes : DWORD* (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; Strides : DWORD* (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; TotalTensorSizeInBytes : ULONGLONG (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; GuaranteedBaseOffsetAlignment : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DML_BUFFER_TENSOR_DESC サイズ: 48 バイト(x64)
dim st, 12 ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; DataType : DML_TENSOR_DATA_TYPE (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; Flags : DML_TENSOR_FLAGS (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; DimensionCount : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; Sizes : DWORD* (+16, 8byte) qpoke st,16,値 / qpeek(st,16) ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; Strides : DWORD* (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; TotalTensorSizeInBytes : ULONGLONG (+32, 8byte) qpoke st,32,値 / qpeek(st,32) ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; GuaranteedBaseOffsetAlignment : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global DML_BUFFER_TENSOR_DESC
#field int DataType
#field int Flags
#field int DimensionCount
#field intptr Sizes
#field intptr Strides
#field int64 TotalTensorSizeInBytes
#field int GuaranteedBaseOffsetAlignment
#endstruct
stdim st, DML_BUFFER_TENSOR_DESC ; NSTRUCT 変数を確保
st->DataType = 100
mes "DataType=" + st->DataType