From f39461341cba27e38fb19d95e7c4d8f0d79023fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 11 Mar 2026 00:17:13 +0800 Subject: [PATCH] init: project framework --- cmd/gemm/main.go | 16 +++++++++ go.mod | 3 ++ init_windows.go | 27 ++++++++++++++ types.go | 74 +++++++++++++++++++++++++++++++++++++++ ze_core_driver_windows.go | 37 ++++++++++++++++++++ 5 files changed, 157 insertions(+) create mode 100644 cmd/gemm/main.go create mode 100644 go.mod create mode 100644 init_windows.go create mode 100644 types.go create mode 100644 ze_core_driver_windows.go diff --git a/cmd/gemm/main.go b/cmd/gemm/main.go new file mode 100644 index 0000000..b74931c --- /dev/null +++ b/cmd/gemm/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + + "github.com/fumiama/gozel" +) + +func main() { + err := gozel.InitZe() + if err != nil { + panic(err) + } + desc := gozel.GPGPUDriverTypeDesc() + fmt.Println(gozel.InitDrivers(&desc)) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..255a8a7 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/fumiama/gozel + +go 1.26.1 diff --git a/init_windows.go b/init_windows.go new file mode 100644 index 0000000..63ee7aa --- /dev/null +++ b/init_windows.go @@ -0,0 +1,27 @@ +package gozel + +import ( + "fmt" + "syscall" +) + +const ( + zeLibraryName = "ze_loader.dll" +) + +var ( + libZeLoader syscall.DLL +) + +func InitZe() error { + h, err := syscall.LoadLibrary(zeLibraryName) + if err != nil { + return err + } + libZeLoader = syscall.DLL{Handle: h, Name: zeLibraryName} + procZeInitDrivers, err = libZeLoader.FindProc("zeInitDrivers") + if err != nil { + return fmt.Errorf("zeInitDrivers not found in ze_loader.dll: %w", err) + } + return nil +} diff --git a/types.go b/types.go new file mode 100644 index 0000000..9032b82 --- /dev/null +++ b/types.go @@ -0,0 +1,74 @@ +package gozel + +import "unsafe" + +// ZeResult maps to ze_result_t +type ZeResult uint32 + +const ( + ZeResultSuccess ZeResult = 0x00000000 + ZeResultNotReady ZeResult = 0x00000001 + ZeResultErrorUninitialized ZeResult = 0x78000001 + ZeResultErrorInvalidArgument ZeResult = 0x78000004 + ZeResultErrorOutOfHostMemory ZeResult = 0x78000006 + ZeResultErrorOutOfDeviceMemory ZeResult = 0x78000007 + ZeResultErrorUnsupported ZeResult = 0x78000009 +) + +func (r ZeResult) Error() string { + switch r { + case ZeResultSuccess: + return "ZE_RESULT_SUCCESS" + case ZeResultNotReady: + return "ZE_RESULT_NOT_READY" + case ZeResultErrorUninitialized: + return "ZE_RESULT_ERROR_UNINITIALIZED" + case ZeResultErrorInvalidArgument: + return "ZE_RESULT_ERROR_INVALID_ARGUMENT" + case ZeResultErrorOutOfHostMemory: + return "ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY" + case ZeResultErrorOutOfDeviceMemory: + return "ZE_RESULT_ERROR_OUT_OF_DEVICE_MEMORY" + case ZeResultErrorUnsupported: + return "ZE_RESULT_ERROR_UNSUPPORTED_FEATURE" + default: + return "ZE_RESULT_UNKNOWN" + } +} + +// ZeDriverHandle maps to ze_driver_handle_t (opaque pointer) +type ZeDriverHandle uintptr + +// ZeStructureType maps to ze_structure_type_t (selected values) +type ZeStructureType uint32 + +const ( + // ZeStructureTypeInitDriverTypeDesc maps to ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC + ZeStructureTypeInitDriverTypeDesc ZeStructureType = 0x00020002 +) + +// ZeInitDriverTypeFlags maps to ze_init_driver_type_flag_t +type ZeInitDriverTypeFlags uint32 + +const ( + ZeInitDriverTypeGPU ZeInitDriverTypeFlags = 1 << 0 + ZeInitDriverTypeNPU ZeInitDriverTypeFlags = 1 << 1 + // ZeInitDriverTypeAll selects all driver types (GPU + NPU) + ZeInitDriverTypeAll ZeInitDriverTypeFlags = ZeInitDriverTypeGPU | ZeInitDriverTypeNPU +) + +// ZeInitDriverTypeDesc maps to ze_init_driver_type_desc_t +type ZeInitDriverTypeDesc struct { + Stype ZeStructureType + PNext unsafe.Pointer + Flags ZeInitDriverTypeFlags +} + +// GPGPUDriverTypeDesc returns a ZeInitDriverTypeDesc configured for GPGPU +// (GPU driver only, correct stype). +func GPGPUDriverTypeDesc() ZeInitDriverTypeDesc { + return ZeInitDriverTypeDesc{ + Stype: ZeStructureTypeInitDriverTypeDesc, + Flags: ZeInitDriverTypeGPU, + } +} diff --git a/ze_core_driver_windows.go b/ze_core_driver_windows.go new file mode 100644 index 0000000..f4ee2fe --- /dev/null +++ b/ze_core_driver_windows.go @@ -0,0 +1,37 @@ +package gozel + +import ( + "syscall" + "unsafe" +) + +var procZeInitDrivers *syscall.Proc + +// InitDrivers calls zeInitDrivers from ze_loader.dll. +// On success pCount contains the number of drivers and phDrivers (if non-nil) +// is filled with driver handles. +func InitDrivers(desc *ZeInitDriverTypeDesc) ([]ZeDriverHandle, error) { + var count uint32 + r, _, _ := procZeInitDrivers.Call( + uintptr(unsafe.Pointer(&count)), + 0, + uintptr(unsafe.Pointer(desc)), + ) + if ZeResult(r) != ZeResultSuccess { + return nil, ZeResult(r) + } + if count == 0 { + return nil, nil + } + + handles := make([]ZeDriverHandle, count) + r, _, _ = procZeInitDrivers.Call( + uintptr(unsafe.Pointer(&count)), + uintptr(unsafe.Pointer(&handles[0])), + uintptr(unsafe.Pointer(desc)), + ) + if ZeResult(r) != ZeResultSuccess { + return nil, ZeResult(r) + } + return handles, nil +}