Summary
I tested the new BMG Sol-Attn path from llm-scaler commit 3ac20587ed77b3e8adb100ca56fa0fbabb062db5 on Windows 11 with an Intel Arc B580.
The Windows sidecar can be compiled and loaded after two host-portability adjustments, and omni_xpu_sol_attn.prepare runs successfully. However, the first omni_xpu_sol_attn.forward_cute execution causes a Level Zero device loss, even with the smallest upstream-style BF16 D128 input.
I understand that setup.py currently filters CUTE/Sol-Attn out on Windows. This report is intended as a minimal reproduction and a request for guidance on the missing Windows BMG runtime support.
Environment
- GPU: Intel Arc B580, PCI Device ID
E20B
- Driver:
32.0.101.8974
- OS: Windows 11, build
26100
- Python:
3.13.12
- PyTorch:
2.13.0+xpu
- oneAPI DPC++:
2026.1.0 Build 20260617
- Visual Studio Build Tools:
17.14.37
- llm-scaler:
3ac20587ed77b3e8adb100ca56fa0fbabb062db5
- ComfyUI-SolAttn_xpu:
5f1c4aac3ca32a00b0b4c15ddbb7cb53fa43344d
- SYCL-TLA:
2fc09973bfdf15755090fcb0e3b6ad236408a992
Isolated Windows build
I compiled these three sources into a Torch-loadable .pyd:
cute_fmha_torch.cpp
sol_attn_prepare.cpp
sol_attn_torch.cpp
The build used the same BMG AOT and SPIR-V extension intent as the Linux CUTE branch:
-fsycl-targets=spir64_gen
- backend target
-device bmg
SPV_INTEL_split_barrier
SPV_INTEL_2d_block_io
SPV_INTEL_subgroup_matrix_multiply_accumulate
Two build-only portability adjustments were needed:
- Explicitly initialize the installed VS 2022 Build Tools before oneAPI.
- In a private include overlay only, replace the host type alias
ushort with equivalent standard C++ unsigned short in mma_xe_legacy_spirv.hpp.
The upstream checkouts were not modified. The resulting sidecar loads through torch.ops.load_library() and registers both prepare and forward_cute.
Built sidecar:
- Size:
1,588,736 bytes
- SHA-256:
4BE1F0F50B84CB1AFE8D6DAAF1D9B15051E2E1D04F9A75054C84E8323B363BA3
Minimal reproduction
prepare completes and synchronizes successfully. The failure occurs only after forward_cute.
import torch
torch.ops.load_library(r"<path-to-built-cute_fmha_torch.pyd>")
ops = torch.ops.omni_xpu_sol_attn
# Sanity check passes.
basic = torch.ones((64,), device="xpu", dtype=torch.float32)
torch.xpu.synchronize()
print(basic.sum().item()) # 64.0
shape = (1, 31, 1, 128)
q = torch.zeros(shape, device="xpu", dtype=torch.bfloat16)
k = torch.zeros_like(q)
v = torch.zeros_like(q)
scale = 128 ** -0.5
prepared = ops.prepare(q, k, v, float(scale), 1.0, 0, 0, 0, 0)
torch.xpu.synchronize() # succeeds
print([tuple(t.shape) for t in prepared])
# [(1,1,1,128), (1,1,1,128), (1,1,1,128), (1,1,1), (1,1,1)]
output = ops.forward_cute(q, k, v, *prepared, float(scale))
torch.xpu.synchronize() # DEVICE_LOST
Actual error:
RuntimeError: level_zero backend failed with error: 20
(UR_RESULT_ERROR_DEVICE_LOST)
An H3-style strided QKV view with shape [1, 129, 2, 128] fails in the same way.
After the test process exits, a new Python process can run ordinary XPU tensors normally, so the device recovers and the failure is isolated to the CUTE/DPAS forward launch.
Expected behavior
The minimal all-zero BF16 D128 input should complete and return a finite all-zero output, as in the upstream Sol-Attn correctness tests.
Questions
- Is Windows BMG CUTE/Sol-Attn runtime support currently expected to work, or is Linux the only supported path at this commit?
- Are different Windows compiler/linker/AOT flags required for the CUTE sidecar?
- Could this be related to the 256-GRF launch property, Block2D/SPIR-V extensions, or the Windows Level Zero launch path?
- If useful, I can provide the exact compile command and the isolated source overlay diff.
Summary
I tested the new BMG Sol-Attn path from llm-scaler commit
3ac20587ed77b3e8adb100ca56fa0fbabb062db5on Windows 11 with an Intel Arc B580.The Windows sidecar can be compiled and loaded after two host-portability adjustments, and
omni_xpu_sol_attn.prepareruns successfully. However, the firstomni_xpu_sol_attn.forward_cuteexecution causes a Level Zero device loss, even with the smallest upstream-style BF16 D128 input.I understand that
setup.pycurrently filters CUTE/Sol-Attn out on Windows. This report is intended as a minimal reproduction and a request for guidance on the missing Windows BMG runtime support.Environment
E20B32.0.101.8974261003.13.122.13.0+xpu2026.1.0 Build 2026061717.14.373ac20587ed77b3e8adb100ca56fa0fbabb062db55f1c4aac3ca32a00b0b4c15ddbb7cb53fa43344d2fc09973bfdf15755090fcb0e3b6ad236408a992Isolated Windows build
I compiled these three sources into a Torch-loadable
.pyd:cute_fmha_torch.cppsol_attn_prepare.cppsol_attn_torch.cppThe build used the same BMG AOT and SPIR-V extension intent as the Linux CUTE branch:
-fsycl-targets=spir64_gen-device bmgSPV_INTEL_split_barrierSPV_INTEL_2d_block_ioSPV_INTEL_subgroup_matrix_multiply_accumulateTwo build-only portability adjustments were needed:
ushortwith equivalent standard C++unsigned shortinmma_xe_legacy_spirv.hpp.The upstream checkouts were not modified. The resulting sidecar loads through
torch.ops.load_library()and registers bothprepareandforward_cute.Built sidecar:
1,588,736bytes4BE1F0F50B84CB1AFE8D6DAAF1D9B15051E2E1D04F9A75054C84E8323B363BA3Minimal reproduction
preparecompletes and synchronizes successfully. The failure occurs only afterforward_cute.Actual error:
An H3-style strided QKV view with shape
[1, 129, 2, 128]fails in the same way.After the test process exits, a new Python process can run ordinary XPU tensors normally, so the device recovers and the failure is isolated to the CUTE/DPAS forward launch.
Expected behavior
The minimal all-zero BF16 D128 input should complete and return a finite all-zero output, as in the upstream Sol-Attn correctness tests.
Questions