Environment
- OS: Windows 11 21H2 (build 22000), non-elevated shell
- GPU: Intel Arc B580 (Battlemage, BMG-G21)
- Driver: 32.0.101.8992 (latest as of 2026-09-06)
- Level Zero loader:
C:\Windows\System32\ze_loader.dll (driver-installed; note: no ze_loader64.dll on this system)
- Driver store:
C:\Windows\System32\DriverStore\FileRepository\iigd_dch_d.inf_amd64_62b87437c1961b1b\
- PyTorch: 2.14.0+xpu, pyzes 0.1.2
Summary
zesDeviceProcessesGetState() always returns ZE_RESULT_ERROR_UNSUPPORTED_FEATURE (0x78000003) on the first (count-query) call. zeInit, zesInit, zesDriverGet, zesDeviceGet all return success; other Sysman queries (e.g. zesMemoryGetState) work fine on the same device handle. Result is identical with and without a prior core zeInit, in both the two-phase (NULL array) and pre-sized single-call patterns.
Impact: torch.xpu.list_gpu_processes() (new in PyTorch 2.14, backed by this API) is unusable on this setup, so there is no way to obtain per-process GPU memory on Windows to detect e.g. leftover Python processes holding VRAM.
Repro (ctypes only, no pyzes needed)
import ctypes
from ctypes import byref, c_uint32, c_void_p, POINTER
class zes_process_state_t(ctypes.Structure):
_fields_ = [
("stype", ctypes.c_int32), ("pNext", ctypes.c_void_p),
("processId", ctypes.c_uint32), ("memSize", ctypes.c_uint64),
("sharedSize", ctypes.c_uint64), ("engines", ctypes.c_uint32),
]
lib = ctypes.WinDLL(r"C:\Windows\System32\ze_loader.dll")
lib.zeInit.restype = ctypes.c_int; lib.zeInit.argtypes = [ctypes.c_uint32]
lib.zesInit.restype = ctypes.c_int; lib.zesInit.argtypes = [ctypes.c_uint32]
print("zeInit:", lib.zeInit(0), " zesInit:", lib.zesInit(0)) # both 0
lib.zesDriverGet.argtypes = [POINTER(c_uint32), c_void_p]
lib.zesDeviceGet.argtypes = [c_void_p, POINTER(c_uint32), c_void_p]
lib.zesDeviceProcessesGetState.argtypes = [c_void_p, POINTER(c_uint32), c_void_p]
n = c_uint32(0)
lib.zesDriverGet(byref(n), None)
drv = (c_void_p * n.value)(); lib.zesDriverGet(byref(n), drv)
n.value = 0
lib.zesDeviceGet(drv[0], byref(n), None)
dev = (c_void_p * n.value)(); lib.zesDeviceGet(drv[0], byref(n), dev)
pc = c_uint32(0)
rc = lib.zesDeviceProcessesGetState(dev[0], byref(pc), None)
print("rc =", hex(rc), " count =", pc.value)
Expected
rc == 0 and count >= 1 after allocating memory on the device (the current process should be listed with its memSize).
Actual
rc = 0x78000003 (ZE_RESULT_ERROR_UNSUPPORTED_FEATURE), count stays 0.
Related observations (secondary)
pyzes 0.1.2 on Windows only probes ze_loader64.dll and the glob ...\FileRepository\iigd_dch.inf_amd64_*\ze_intel_gpu64.dll / igdlh64..., but this driver installs the loader as ze_loader.dll (no 64) and the driver-store folder is named iigd_dch_d.inf_amd64_... (extra _d). As a result import pyzes fails with "Failed to load Intel GPU library", and torch's lazy import fails before it can even call the API.
The engines field of zes_process_state_t would be valuable for UI (compute vs 3D vs media) — please confirm whether the Windows driver ever populates it.
Questions
Is zesDeviceProcessesGetState supported at all by the Windows Arc driver today, or is it a Linux-only / future feature?
If supported, is there a prerequisite (D3D/DXGI device creation, elevated rights, driver model flag)?
Environment
C:\Windows\System32\ze_loader.dll(driver-installed; note: noze_loader64.dllon this system)C:\Windows\System32\DriverStore\FileRepository\iigd_dch_d.inf_amd64_62b87437c1961b1b\Summary
zesDeviceProcessesGetState()always returnsZE_RESULT_ERROR_UNSUPPORTED_FEATURE(0x78000003) on the first (count-query) call.zeInit,zesInit,zesDriverGet,zesDeviceGetall return success; other Sysman queries (e.g.zesMemoryGetState) work fine on the same device handle. Result is identical with and without a prior corezeInit, in both the two-phase (NULL array) and pre-sized single-call patterns.Impact:
torch.xpu.list_gpu_processes()(new in PyTorch 2.14, backed by this API) is unusable on this setup, so there is no way to obtain per-process GPU memory on Windows to detect e.g. leftover Python processes holding VRAM.Repro (ctypes only, no pyzes needed)
Expected
rc == 0 and count >= 1 after allocating memory on the device (the current process should be listed with its memSize).
Actual
rc = 0x78000003 (ZE_RESULT_ERROR_UNSUPPORTED_FEATURE), count stays 0.
Related observations (secondary)
pyzes 0.1.2 on Windows only probes ze_loader64.dll and the glob ...\FileRepository\iigd_dch.inf_amd64_*\ze_intel_gpu64.dll / igdlh64..., but this driver installs the loader as ze_loader.dll (no 64) and the driver-store folder is named iigd_dch_d.inf_amd64_... (extra _d). As a result import pyzes fails with "Failed to load Intel GPU library", and torch's lazy import fails before it can even call the API.
The engines field of zes_process_state_t would be valuable for UI (compute vs 3D vs media) — please confirm whether the Windows driver ever populates it.
Questions
Is zesDeviceProcessesGetState supported at all by the Windows Arc driver today, or is it a Linux-only / future feature?
If supported, is there a prerequisite (D3D/DXGI device creation, elevated rights, driver model flag)?