Win32 API 日本語リファレンス
ホームAI.MachineLearning.DirectML › DML_GRAPH_DESC

DML_GRAPH_DESC

構造体
サイズx64: 72 バイト / x86: 40 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
InputCountDWORD4+0+0グラフ全体の入力の数。各グラフ入力は可変個の内部ノードに接続できるため、この値は InputEdgeCount と異なる場合があります。
OutputCountDWORD4+4+4グラフ全体の出力の数。各グラフ出力は可変個の内部ノードに接続できるため、この値は OutputEdgeCount と異なる場合があります。
NodeCountDWORD4+8+8グラフ内の内部ノードの数。
NodesDML_GRAPH_NODE_DESC*8/4+16+12グラフ内の内部ノード。
InputEdgeCountDWORD4+24+16グラフの入力と、グラフ内の内部ノードの入力との間の接続の数。
InputEdgesDML_GRAPH_EDGE_DESC*8/4+32+20グラフの入力と、グラフ内の内部ノードの入力との間の接続の配列。各要素の Type フィールドには DML_GRAPH_EDGE_TYPE_INPUT を設定します。
OutputEdgeCountDWORD4+40+24グラフの出力と、グラフ内の内部ノードの出力との間の接続の数。
OutputEdgesDML_GRAPH_EDGE_DESC*8/4+48+28グラフの出力と、グラフ内の内部ノードの出力との間の接続の配列。各要素の Type フィールドには DML_GRAPH_EDGE_TYPE_OUTPUT を設定します。
IntermediateEdgeCountDWORD4+56+32グラフ内のノード間の内部接続の数。
IntermediateEdgesDML_GRAPH_EDGE_DESC*8/4+64+36グラフ内の内部ノードの入力と出力との間の接続の配列。各要素の Type フィールドには DML_GRAPH_EDGE_TYPE_INTERMEDIATE を設定します

公式ドキュメント

結合され最適化された演算子をコンパイルするために使用する、DirectML 演算子のグラフを記述します。IDMLDevice1::CompileGraph を参照してください。

解説(Remarks)

この構造体が記述するグラフは、有向非巡回グラフでなければなりません。指定した各ノードの入力と出力には、対応する演算子で省略可能な入力と出力を除き、接続を定義する必要があります。

ノードでは、特定の入力に対して DML_TENSOR_FLAG_OWNED_BY_DML フラグを使用して作成された演算子を使用できます。このフラグを使用する演算子の入力は、いずれもグラフの入力に接続しなければなりません。同じグラフ入力に接続されるすべての演算子入力は、このフラグの使用または省略を一致させる必要があります。

接続される入力と出力で次元数、サイズ、データ型が異なる演算子どうしを接続することは可能です。これは、テンソルのデータ ブロブが演算子ごとに異なる解釈をされることを意味します。ただし、接続されるテンソルの入力と出力の TotalTensorSizeInBytes フィールドは同一でなければなりません。演算子は、それ以前の演算子が書き込んだテンソルの領域のみを読み取るようにしてください。ある演算の出力に含まれるパディング領域 (ストライドの使用によって生じるもの) は、後続の演算子から 0 として読み取られることが保証されません。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// DML_GRAPH_DESC  (x64 72 / x86 40 バイト)
typedef struct DML_GRAPH_DESC {
    DWORD InputCount;
    DWORD OutputCount;
    DWORD NodeCount;
    DML_GRAPH_NODE_DESC* Nodes;
    DWORD InputEdgeCount;
    DML_GRAPH_EDGE_DESC* InputEdges;
    DWORD OutputEdgeCount;
    DML_GRAPH_EDGE_DESC* OutputEdges;
    DWORD IntermediateEdgeCount;
    DML_GRAPH_EDGE_DESC* IntermediateEdges;
} DML_GRAPH_DESC;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DML_GRAPH_DESC
{
    public uint InputCount;
    public uint OutputCount;
    public uint NodeCount;
    public IntPtr Nodes;
    public uint InputEdgeCount;
    public IntPtr InputEdges;
    public uint OutputEdgeCount;
    public IntPtr OutputEdges;
    public uint IntermediateEdgeCount;
    public IntPtr IntermediateEdges;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DML_GRAPH_DESC
    Public InputCount As UInteger
    Public OutputCount As UInteger
    Public NodeCount As UInteger
    Public Nodes As IntPtr
    Public InputEdgeCount As UInteger
    Public InputEdges As IntPtr
    Public OutputEdgeCount As UInteger
    Public OutputEdges As IntPtr
    Public IntermediateEdgeCount As UInteger
    Public IntermediateEdges As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class DML_GRAPH_DESC(ctypes.Structure):
    _fields_ = [
        ("InputCount", wintypes.DWORD),
        ("OutputCount", wintypes.DWORD),
        ("NodeCount", wintypes.DWORD),
        ("Nodes", ctypes.c_void_p),
        ("InputEdgeCount", wintypes.DWORD),
        ("InputEdges", ctypes.c_void_p),
        ("OutputEdgeCount", wintypes.DWORD),
        ("OutputEdges", ctypes.c_void_p),
        ("IntermediateEdgeCount", wintypes.DWORD),
        ("IntermediateEdges", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct DML_GRAPH_DESC {
    pub InputCount: u32,
    pub OutputCount: u32,
    pub NodeCount: u32,
    pub Nodes: *mut core::ffi::c_void,
    pub InputEdgeCount: u32,
    pub InputEdges: *mut core::ffi::c_void,
    pub OutputEdgeCount: u32,
    pub OutputEdges: *mut core::ffi::c_void,
    pub IntermediateEdgeCount: u32,
    pub IntermediateEdges: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type DML_GRAPH_DESC struct {
	InputCount uint32
	OutputCount uint32
	NodeCount uint32
	Nodes uintptr
	InputEdgeCount uint32
	InputEdges uintptr
	OutputEdgeCount uint32
	OutputEdges uintptr
	IntermediateEdgeCount uint32
	IntermediateEdges uintptr
}
type
  DML_GRAPH_DESC = record
    InputCount: DWORD;
    OutputCount: DWORD;
    NodeCount: DWORD;
    Nodes: Pointer;
    InputEdgeCount: DWORD;
    InputEdges: Pointer;
    OutputEdgeCount: DWORD;
    OutputEdges: Pointer;
    IntermediateEdgeCount: DWORD;
    IntermediateEdges: Pointer;
  end;
const DML_GRAPH_DESC = extern struct {
    InputCount: u32,
    OutputCount: u32,
    NodeCount: u32,
    Nodes: ?*anyopaque,
    InputEdgeCount: u32,
    InputEdges: ?*anyopaque,
    OutputEdgeCount: u32,
    OutputEdges: ?*anyopaque,
    IntermediateEdgeCount: u32,
    IntermediateEdges: ?*anyopaque,
};
type
  DML_GRAPH_DESC {.bycopy.} = object
    InputCount: uint32
    OutputCount: uint32
    NodeCount: uint32
    Nodes: pointer
    InputEdgeCount: uint32
    InputEdges: pointer
    OutputEdgeCount: uint32
    OutputEdges: pointer
    IntermediateEdgeCount: uint32
    IntermediateEdges: pointer
struct DML_GRAPH_DESC
{
    uint InputCount;
    uint OutputCount;
    uint NodeCount;
    void* Nodes;
    uint InputEdgeCount;
    void* InputEdges;
    uint OutputEdgeCount;
    void* OutputEdges;
    uint IntermediateEdgeCount;
    void* IntermediateEdges;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; DML_GRAPH_DESC サイズ: 40 バイト(x86)
dim st, 10    ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; InputCount : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; OutputCount : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; NodeCount : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; Nodes : DML_GRAPH_NODE_DESC* (+12, 4byte)  varptr(st)+12 を基点に操作(4byte:入れ子/配列)
; InputEdgeCount : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; InputEdges : DML_GRAPH_EDGE_DESC* (+20, 4byte)  varptr(st)+20 を基点に操作(4byte:入れ子/配列)
; OutputEdgeCount : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; OutputEdges : DML_GRAPH_EDGE_DESC* (+28, 4byte)  varptr(st)+28 を基点に操作(4byte:入れ子/配列)
; IntermediateEdgeCount : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; IntermediateEdges : DML_GRAPH_EDGE_DESC* (+36, 4byte)  varptr(st)+36 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DML_GRAPH_DESC サイズ: 72 バイト(x64)
dim st, 18    ; 4byte整数×18(構造体サイズ 72 / 4 切り上げ)
; InputCount : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; OutputCount : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; NodeCount : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; Nodes : DML_GRAPH_NODE_DESC* (+16, 8byte)  varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; InputEdgeCount : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; InputEdges : DML_GRAPH_EDGE_DESC* (+32, 8byte)  varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; OutputEdgeCount : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; OutputEdges : DML_GRAPH_EDGE_DESC* (+48, 8byte)  varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; IntermediateEdgeCount : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; IntermediateEdges : DML_GRAPH_EDGE_DESC* (+64, 8byte)  varptr(st)+64 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global DML_GRAPH_DESC
    #field int InputCount
    #field int OutputCount
    #field int NodeCount
    #field intptr Nodes
    #field int InputEdgeCount
    #field intptr InputEdges
    #field int OutputEdgeCount
    #field intptr OutputEdges
    #field int IntermediateEdgeCount
    #field intptr IntermediateEdges
#endstruct

stdim st, DML_GRAPH_DESC        ; NSTRUCT 変数を確保
st->InputCount = 100
mes "InputCount=" + st->InputCount