Skip to content

torch.xpu.list_gpu_processes() unusable ~ zesDeviceProcessesGetState returns ZE_RESULT_ERROR_UNSUPPORTED_FEATURE on Intel Arc B580 #509

Description

@allanmeng

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)?

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions