CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
85 lines
4.4 KiB
ReStructuredText
85 lines
4.4 KiB
ReStructuredText
.. meta::
|
|
:description: rocSOLVER memory model documentation
|
|
:keywords: rocSOLVER, ROCm, API, documentation, memory model
|
|
|
|
.. _memory:
|
|
|
|
*******************************
|
|
rocSOLVER memory model
|
|
*******************************
|
|
|
|
Almost all LAPACK and rocSOLVER routines require workspace memory to compute their results. In contrast to LAPACK,
|
|
however, pointers to the workspace are not explicitly passed to the rocSOLVER functions as arguments. They are
|
|
instead managed behind-the-scenes using a configurable device memory model.
|
|
|
|
rocSOLVER makes use of, and is integrated with, :doc:`the rocBLAS memory model <rocblas:reference/memory-alloc>`. Workspace memory
|
|
and the scheme used to manage it are tracked for each ``rocblas_handle``. The same functionality that is used to
|
|
manipulate the rocBLAS workspace memory also affects the rocSOLVER workspace memory.
|
|
For more information, see the rocBLAS :ref:`rocblas:Device Memory allocation in detail` documentation.
|
|
|
|
There are two schemes for device memory management:
|
|
|
|
* Automatic (managed by rocSOLVER/rocBLAS): This is the default scheme. Device memory persists between function
|
|
calls and is automatically reallocated if more memory is required by a function.
|
|
* User-owned: The user manually allocates device memory and calls a rocBLAS helper function to use this memory
|
|
as the workspace.
|
|
|
|
Automatic workspace
|
|
================================================
|
|
|
|
By default, rocSOLVER automatically allocates device memory for the internal workspace
|
|
using the rocBLAS memory model and increases the amount of allocated memory to meet the needs of the rocSOLVER functions.
|
|
If this scheme is in use, the function ``rocblas_is_managing_device_memory`` returns
|
|
``true``. To re-enable this scheme if it's not in use, pass a ``nullptr`` or a size of ``0`` to the
|
|
helper function ``rocblas_set_workspace``. For more details on these rocBLAS APIs,
|
|
see :doc:`Device Memory Allocation Functions in rocBLAS <rocblas:reference/memory-alloc>`.
|
|
|
|
This scheme has the disadvantage that automatic reallocation is synchronizing, but the user cannot control when this synchronization happens.
|
|
|
|
User-owned workspace
|
|
================================================
|
|
|
|
Alternatively, you have the option to manage the workspace memory manually using HIP.
|
|
This involves querying rocSOLVER to determine the minimum amount of memory required,
|
|
allocating the memory with ``hipMalloc``, and passing the resulting pointer to rocBLAS.
|
|
|
|
Minimum required size
|
|
------------------------------
|
|
|
|
To choose an appropriate amount of memory to allocate, query rocSOLVER to determine
|
|
the minimum amount of memory required for the functions to complete.
|
|
Start the query by calling ``rocblas_start_device_memory_size_query``, then call the desired functions with appropriate problem sizes (a null pointer
|
|
can be passed to the device pointer arguments). A final call to ``rocblas_stop_device_memory_size_query`` returns the minimum required size.
|
|
|
|
For example, the following code snippet returns the memory size required to solve a 1024*1024 linear system with one right-hand side (involving calls to ``getrf`` and ``getrs``):
|
|
|
|
.. code-block:: cpp
|
|
|
|
size_t memory_size;
|
|
rocblas_start_device_memory_size_query(handle);
|
|
rocsolver_dgetrf(handle, 1024, 1024, nullptr, lda, nullptr, nullptr);
|
|
rocsolver_dgetrs(handle, rocblas_operation_none, 1024, 1, nullptr, lda, nullptr, nullptr, ldb);
|
|
rocblas_stop_device_memory_size_query(handle, &memory_size);
|
|
|
|
For more details on the rocBLAS APIs, see :doc:`Device Memory Allocation Functions in rocBLAS <rocblas:reference/memory-alloc>`.
|
|
|
|
Setting the workspace
|
|
------------------------------
|
|
|
|
Call the function ``rocblas_set_workspace`` and pass a pointer to device memory to rocBLAS for it to use as the rocSOLVER workspace. For example:
|
|
|
|
.. code-block:: cpp
|
|
|
|
void* device_memory;
|
|
hipMalloc(&device_memory, memory_size);
|
|
rocblas_set_workspace(handle, device_memory, memory_size);
|
|
|
|
// perform computations here
|
|
rocblas_set_workspace(handle, nullptr, 0);
|
|
hipFree(device_memory);
|
|
|
|
For more details on the rocBLAS APIs, see :doc:`Device Memory Allocation Functions in rocBLAS <rocblas:reference/memory-alloc>`.
|
|
|
|
.. _the rocBLAS memory model: https://rocm.docs.amd.com/projects/rocBLAS/en/latest/API_Reference_Guide.html#device-memory-allocation-in-rocblas
|
|
.. _Device Memory Allocation Functions in rocBLAS: https://rocm.docs.amd.com/projects/rocBLAS/en/latest/API_Reference_Guide.html#device-memory-allocation-in-rocblas
|