Hi,
I’m developing a CUDA inference engine for RTX Spark with 128 GB of unified memory.
I configured the memory split to give about 96 GiB to the GPU and the rest to Windows. However, I found that cuMemAlloc() increases Windows system commit by almost the same amount as the GPU allocation.
This is a problem because my Windows commit limit is only 60.25 GiB, even though the GPU has about 96 GiB of dedicated memory.
I’m trying to keep around 70 GiB of model weights on the GPU, but the system commit limit may prevent this.
My system
-
GPU: NVIDIA RTX Spark N1X (Blackwell, 6144 CUDA cores)
-
Memory: 128 GB unified memory
-
OS: Windows 11 Home ARM64, build 28000
-
NVIDIA driver: 32.0.16.1742 (September 30, 2026)
-
CUDA: 13.4
-
GPU dedicated capacity (DXGI): 95.99 GiB
-
CPU-visible physical memory: 30.49 GiB
-
Windows system commit limit: 60.25 GiB
What I tested
To rule out a problem in my inference engine, I wrote a small standalone CUDA C program.
The program does not load any model or allocate CPU weight buffers. It only:
-
Calls
cuMemAlloc()to allocate GPU memory. -
Measures GPU memory usage, process private bytes, and CPU working set before writing anything to the allocation.
-
Writes to the GPU allocation using
cuMemsetD8(). -
Reads back a few bytes to verify the data.
-
Calls
cuMemFree().
There are no host-to-device copies.
Results
For the first 64 MiB GPU allocation, measured immediately after cuMemAlloc() and before any GPU writes:
| Measurement | Increase |
|---|---|
| GPU local memory usage (DXGI) | 64 MiB |
| Process PrivateUsage | 64.125 MiB |
| CPU private committed virtual memory | 64 MiB |
| CPU working set | 16 KiB |
VirtualQuery() also showed a new 64 MiB CPU virtual memory region with:
-
MEM_PRIVATE -
MEM_COMMIT -
PAGE_READWRITE | PAGE_WRITECOMBINE
So the GPU allocation is consuming CPU-side commit, even before any data is written.
The CPU working set barely changed. This does not mean another 64 MiB copy is physically stored in CPU RAM.
I also tested sequential allocations of 64, 256, 256, and 64 MiB, freeing each allocation before the next one.
| GPU allocation | PrivateUsage increase |
|---|---|
| First 64 MiB | 64.125 MiB |
| 256 MiB | 192.371 MiB |
| Another 256 MiB | 64.129 MiB |
| Final 64 MiB | 0 MiB |
Some of the committed regions remained after cuMemFree() and appeared to be reused by later allocations. So I don’t think these results alone indicate a memory leak.
I also tested a D3D12 heap allocation separately. Creating a roughly 1 GiB heap consumed about 1 GiB of available system commit, even before CUDA imported it.
Why I’m concerned
I understand that WDDM can use system memory backing stores for GPU allocations.
But RTX Spark uses unified physical memory, and I’ve already reserved about 96 GiB for dedicated GPU memory.
If allocating 70 GiB of GPU memory also requires 70 GiB of system commit, I cannot fully use the GPU memory because the Windows commit limit is much lower.
It seems strange to reserve most of the system memory for the GPU and then be limited by the remaining Windows commit budget.
My questions
-
Is this expected behavior for CUDA allocations on RTX Spark under Windows WDDM?
-
Why does a GPU-only allocation in dedicated GPU memory require a similar amount of system commit?
-
Is there a supported CUDA allocation method or driver setting that avoids this additional commit requirement?
-
Is increasing the Windows page file the intended workaround, even when the GPU memory is physically available?
-
Could this be an RTX Spark driver issue, or is it a limitation of the current Windows memory management model?
I also tested CUDA VMM and D3D12 allocation paths, but so far neither showed a clear improvement in system commit usage.
I’m not claiming this is a driver bug. I’m trying to understand whether this behavior is expected and how to use the full dedicated GPU memory for large AI models on Windows.
I can share the minimal CUDA C reproduction code and measurement logs if needed.
Thanks!