MLX
Loading...
Searching...
No Matches
allocator.h
Go to the documentation of this file.
1// Copyright © 2023-2024 Apple Inc.
2
3#pragma once
4
5#include <map>
6#include <mutex>
7#include <vector>
8
9#include "mlx/allocator.h"
11
13
15
16namespace {
17
18class BufferCache {
19 public:
20 BufferCache(MTL::Device* device);
21 ~BufferCache();
22
23 MTL::Buffer* reuse_from_cache(size_t size);
24 void recycle_to_cache(MTL::Buffer* buf);
25 void release_cached_buffers(size_t min_bytes_to_free);
26 size_t cache_size() {
27 return pool_size_;
28 }
29 void clear();
30
31 private:
32 struct BufferHolder {
33 public:
34 BufferHolder(MTL::Buffer* buf_) : buf(buf_), prev(nullptr), next(nullptr) {}
35
36 BufferHolder* prev;
37 BufferHolder* next;
38 MTL::Buffer* buf;
39 };
40
41 void add_at_head(BufferHolder* to_add);
42 void remove_from_list(BufferHolder* to_remove);
43
44 MTL::Device* device_;
45
46 std::multimap<size_t, BufferHolder*> buffer_pool_;
47 BufferHolder* head_;
48 BufferHolder* tail_;
49 size_t pool_size_;
50};
51
52} // namespace
53
56 public:
57 virtual Buffer malloc(size_t size, bool allow_swap = false) override;
58 virtual void free(Buffer buffer) override;
59 virtual size_t size(Buffer buffer) const override;
61 return active_memory_;
62 };
63 size_t get_peak_memory() {
64 return peak_memory_;
65 };
67 std::unique_lock lk(mutex_);
68 peak_memory_ = 0;
69 };
71 return buffer_cache_.cache_size();
72 };
73 size_t set_cache_limit(size_t limit);
74 size_t set_memory_limit(size_t limit, bool relaxed);
76
77 private:
78 MTL::Device* device_;
81
82 // Caching allocator
83 BufferCache buffer_cache_;
84
85 // Allocation stats
86 size_t block_limit_;
87 size_t gc_limit_;
88 size_t active_memory_{0};
89 size_t peak_memory_{0};
90 size_t max_pool_size_;
91 bool relaxed_{true};
92
93 std::mutex mutex_;
94};
95
97
98} // namespace mlx::core::metal
MTL::Buffer * buf
Definition allocator.h:38
BufferHolder * prev
Definition allocator.h:36
BufferHolder * next
Definition allocator.h:37
Definition allocator.h:39
Definition allocator.h:12
Definition allocator.h:54
virtual void free(Buffer buffer) override
size_t set_memory_limit(size_t limit, bool relaxed)
void reset_peak_memory()
Definition allocator.h:66
virtual size_t size(Buffer buffer) const override
virtual Buffer malloc(size_t size, bool allow_swap=false) override
Allocator for Metal GPUs.
size_t get_active_memory()
Definition allocator.h:60
size_t get_peak_memory()
Definition allocator.h:63
size_t get_cache_memory()
Definition allocator.h:70
size_t set_cache_limit(size_t limit)
friend MetalAllocator & allocator()
Definition allocator.h:12
MetalAllocator & allocator()
Device & device(mlx::core::Device)