2323
2424#include " arithmetic.h"
2525#include " sys_mem.h"
26- #include < atomic>
2726#include < cstdlib>
2827#include < cstring>
29- #include < iostream>
28+ #include < sstream>
29+
3030#include < new>
3131
3232#ifndef _WIN32
3333#include < stdlib.h>
3434#include < sys/mman.h>
3535#endif
3636
37- struct HOSTBUF_MEM_USAGE : public std ::runtime_error
38- {
39- using std::runtime_error::runtime_error;
40- };
41-
4237// Simple RAII class for host buffers. T is the type of pointer that
4338// data() returns
4439template <class T = void >
@@ -87,18 +82,19 @@ class hostbuf_t
8782 {
8883 free ();
8984
90- bsize = size;
91-
92- auto usable_mem = host_memory::singleton ().get_usable_bytes ();
93- if (total_used_mem + size > usable_mem)
85+ if (size > system_memory::singleton ().get_usable_bytes ())
9486 {
9587 std::stringstream msg;
96- msg << " Host memory usage limit exceed (used mem: "
97- << bytes_to_GiB (total_used_mem + size)
98- << " GiB, free mem: " << bytes_to_GiB (usable_mem) << " GiB)" ;
99- throw HOSTBUF_MEM_USAGE{msg.str ()};
88+ msg << " Unauthorized host allocation.\n "
89+ << " \t Requested byte size is " << size << " \n "
90+ << " \t Usable byte size is " << system_memory::singleton ().get_usable_bytes () << " \n "
91+ << " \t Free system memory: " << system_memory::singleton ().get_free_bytes () << " \n "
92+ << " \t Used system memory: " << system_memory::singleton ().get_used_bytes () << " \n "
93+ << " \t Enforced usage limit: " << system_memory::singleton ().get_limit_bytes ();
94+ throw SYS_MEM_USAGE{msg.str ()};
10095 }
10196
97+ bsize = size;
10298 if (make_it_pinned)
10399 {
104100 if (hipHostMalloc (&buf, size) != hipSuccess)
@@ -142,7 +138,7 @@ class hostbuf_t
142138
143139 is_pinned_memory = make_it_pinned;
144140 bsize_track = size;
145- total_used_mem += bsize_track;
141+ system_memory::singleton (). record_used_bytes ( bsize_track) ;
146142 }
147143
148144 size_t size () const
@@ -161,7 +157,6 @@ class hostbuf_t
161157 {
162158 if (owned)
163159 {
164- total_used_mem -= bsize_track;
165160 if (is_pinned_memory)
166161 {
167162 (void )hipHostFree (buf);
@@ -174,6 +169,7 @@ class hostbuf_t
174169 std::free (buf);
175170#endif
176171 }
172+ system_memory::singleton ().release_used_bytes (bsize_track);
177173 }
178174 buf = nullptr ;
179175 bsize = bsize_track = 0 ;
@@ -238,9 +234,6 @@ class hostbuf_t
238234 // Buffer size for tracking total memory usage.
239235 // When buffer is shrunk in place, bsize_track is not changed.
240236 size_t bsize_track = 0 ;
241-
242- // Keeps track of total used memory for all hostbufs
243- inline static std::atomic<size_t > total_used_mem = 0 ;
244237};
245238
246239// default hostbuf that gives out void* pointers
0 commit comments