GPU Memory Management

CuBIE manages GPU memory (VRAM) automatically, but understanding the available options lets you run larger batches and avoid out-of-memory errors.

Default Behaviour

A solver keeps its device and pinned host buffers between calls to solve(). A batch of the same size or smaller reuses them; a larger batch replaces them. Closing the solver returns its memory to the device and the operating system.

When you pass device arrays and on_device=True in a loop, write each batch into the same arrays with copy_to_device rather than allocating new ones: freeing a Numba device array waits for all work on the GPU.

VRAM Limits

CuBIE estimates the available VRAM and sizes the batch accordingly. You can override the proportion of VRAM that CuBIE is allowed to use:

solver = qb.Solver(system, algorithm="dormand-prince-54",
                    memory_settings={"mem_proportion": 0.7})

Set a lower proportion if other processes share the GPU.

Automatic Chunking

When a batch is too large to fit in VRAM in one go, CuBIE automatically splits it into chunks and processes them sequentially. The results are concatenated transparently—you always get a single SolveResult.

Chunking is triggered automatically when the estimated memory requirement exceeds the available VRAM.

Stream Groups

For advanced use, CuBIE supports running multiple chunks concurrently on different CUDA streams via stream groups. This can hide data-transfer latency behind compute. Configure via memory_settings={"stream_group": ...} on the Solver.