| | |
| |
|
| | #include "mlx/memory.h" |
| | #include <nanobind/nanobind.h> |
| |
|
| | namespace mx = mlx::core; |
| | namespace nb = nanobind; |
| | using namespace nb::literals; |
| |
|
| | void init_memory(nb::module_& m) { |
| | m.def( |
| | "get_active_memory", |
| | &mx::get_active_memory, |
| | R"pbdoc( |
| | Get the actively used memory in bytes. |
| | |
| | Note, this will not always match memory use reported by the system because |
| | it does not include cached memory buffers. |
| | )pbdoc"); |
| | m.def( |
| | "get_peak_memory", |
| | &mx::get_peak_memory, |
| | R"pbdoc( |
| | Get the peak amount of used memory in bytes. |
| | |
| | The maximum memory used recorded from the beginning of the program |
| | execution or since the last call to :func:`reset_peak_memory`. |
| | )pbdoc"); |
| | m.def( |
| | "reset_peak_memory", |
| | &mx::reset_peak_memory, |
| | R"pbdoc( |
| | Reset the peak memory to zero. |
| | )pbdoc"); |
| | m.def( |
| | "get_cache_memory", |
| | &mx::get_cache_memory, |
| | R"pbdoc( |
| | Get the cache size in bytes. |
| | |
| | The cache includes memory not currently used that has not been returned |
| | to the system allocator. |
| | )pbdoc"); |
| | m.def( |
| | "set_memory_limit", |
| | &mx::set_memory_limit, |
| | "limit"_a, |
| | R"pbdoc( |
| | Set the memory limit. |
| | |
| | The memory limit is a guideline for the maximum amount of memory to use |
| | during graph evaluation. If the memory limit is exceeded and there is no |
| | more RAM (including swap when available) allocations will result in an |
| | exception. |
| | |
| | When metal is available the memory limit defaults to 1.5 times the |
| | maximum recommended working set size reported by the device. |
| | |
| | Args: |
| | limit (int): Memory limit in bytes. |
| | |
| | Returns: |
| | int: The previous memory limit in bytes. |
| | )pbdoc"); |
| | m.def( |
| | "set_cache_limit", |
| | &mx::set_cache_limit, |
| | "limit"_a, |
| | R"pbdoc( |
| | Set the free cache limit. |
| | |
| | If using more than the given limit, free memory will be reclaimed |
| | from the cache on the next allocation. To disable the cache, set |
| | the limit to ``0``. |
| | |
| | The cache limit defaults to the memory limit. See |
| | :func:`set_memory_limit` for more details. |
| | |
| | Args: |
| | limit (int): The cache limit in bytes. |
| | |
| | Returns: |
| | int: The previous cache limit in bytes. |
| | )pbdoc"); |
| | m.def( |
| | "set_wired_limit", |
| | &mx::set_wired_limit, |
| | "limit"_a, |
| | R"pbdoc( |
| | Set the wired size limit. |
| | |
| | .. note:: |
| | * This function is only useful on macOS 15.0 or higher. |
| | * The wired limit should remain strictly less than the total |
| | memory size. |
| | |
| | The wired limit is the total size in bytes of memory that will be kept |
| | resident. The default value is ``0``. |
| | |
| | Setting a wired limit larger than system wired limit is an error. You can |
| | increase the system wired limit with: |
| | |
| | .. code-block:: |
| | |
| | sudo sysctl iogpu.wired_limit_mb=<size_in_megabytes> |
| | |
| | Use :func:`device_info` to query the system wired limit |
| | (``"max_recommended_working_set_size"``) and the total memory size |
| | (``"memory_size"``). |
| | |
| | Args: |
| | limit (int): The wired limit in bytes. |
| | |
| | Returns: |
| | int: The previous wired limit in bytes. |
| | )pbdoc"); |
| | m.def( |
| | "clear_cache", |
| | &mx::clear_cache, |
| | R"pbdoc( |
| | Clear the memory cache. |
| | |
| | After calling this, :func:`get_cache_memory` should return ``0``. |
| | )pbdoc"); |
| | } |
| |
|