diff --git a/Lib/buffer.cpp b/Lib/buffer.cpp index 919d511989f082d546d3f7d683dae0c5a290a0b7..572da6196725bd84e40b92d8273da08ce3147b54 100644 --- a/Lib/buffer.cpp +++ b/Lib/buffer.cpp @@ -3,29 +3,14 @@ #ifdef INCLUDE_CUDA #include "MemoryProcessing.cuh" #endif -// void dyn_dispatch_buffer::reallocate(buffer_base* obj, const size_t required_size) -// { -// obj->reallocate(required_size); -// } -// void dyn_dispatch_buffer::deallocate(buffer_base* obj) -// { -// obj->deallocate(); -// } +#include <cassert> +#include <utility> -buffer_base::buffer_base() +void buffer::reallocate(const size_t required_size) { - ptr = nullptr; - allocated_size = 0; - scalar_size = 0; - is_free = true; - id = -1; - // ! resolve - mem = MemType::CPU; -} + assert(mem != MemType::UNDEF); -void buffer_base::reallocate(const size_t required_size) -{ if(mem == MemType::CPU) memproc::realloc<MemType::CPU>((void *&)ptr, allocated_size, required_size); #ifdef INCLUDE_CUDA @@ -34,8 +19,11 @@ void buffer_base::reallocate(const size_t required_size) #endif } -void buffer_base::deallocate() +void buffer::deallocate() { + if(mem == MemType::UNDEF) + return; + if(mem == MemType::CPU) memproc::dealloc<MemType::CPU>((void *&)ptr, allocated_size); #ifdef INCLUDE_CUDA @@ -44,18 +32,21 @@ void buffer_base::deallocate() #endif } -buffer_base::~buffer_base() +buffer::~buffer() { deallocate(); ptr = nullptr; scalar_size = 0; is_free = true; id = -1; + mem = MemType::UNDEF; } -buffer_base::buffer_base(const buffer_base& other) +buffer::buffer(const buffer& other) { + assert(other.mem != MemType::UNDEF); + mem = other.mem; allocated_size = 0; reallocate(other.get_size()); @@ -63,27 +54,28 @@ buffer_base::buffer_base(const buffer_base& other) id = other.get_id(); } -buffer_base::buffer_base(buffer_base&& other) +buffer::buffer(buffer&& other) noexcept : + mem(other.mem), ptr(std::move(other.ptr)), allocated_size(other.allocated_size), + scalar_size(other.scalar_size), is_free(other.is_free), + id(other.id) { - mem = other.mem; - ptr = other.ptr; - allocated_size = other.allocated_size; - scalar_size = other.scalar_size; - is_free = other.is_free; - id = other.id; + assert(other.mem != MemType::UNDEF); other.ptr = nullptr; other.allocated_size = 0; other.scalar_size = 0; other.is_free = false; other.id = -1; + other.mem = MemType::UNDEF; } -buffer_base& buffer_base::operator=(const buffer_base& other) +buffer& buffer::operator=(const buffer& other) { if (this == &other) return *this; - + + assert(other.mem != MemType::UNDEF); + mem = other.mem; reallocate(other.get_size()); is_free = other.get_status(); @@ -92,13 +84,15 @@ buffer_base& buffer_base::operator=(const buffer_base& other) return *this; } -buffer_base& buffer_base::operator=(buffer_base&& other) +buffer& buffer::operator=(buffer&& other) noexcept { if (this != &other) { - mem = other.mem; + assert(other.mem != MemType::UNDEF); deallocate(); - ptr = other.ptr; + + mem = other.mem; + ptr = std::move(other.ptr); allocated_size = other.allocated_size; scalar_size = other.scalar_size; is_free = other.is_free; @@ -109,19 +103,22 @@ buffer_base& buffer_base::operator=(buffer_base&& other) other.scalar_size = 0; other.is_free = false; other.id = -1; + other.mem = MemType::UNDEF; } return *this; } -bool buffer_base::is_available() const +bool buffer::is_available() const { return is_free; } -buffer_base::buffer_base(const size_t required_size, const MemType mem_in) +buffer::buffer(const size_t required_size, const MemType mem_in) { + assert(mem_in != MemType::UNDEF); + mem = mem_in; ptr = nullptr; allocated_size = 0; @@ -130,59 +127,42 @@ buffer_base::buffer_base(const size_t required_size, const MemType mem_in) is_free = false; } -void* buffer_base::get_ptr() +void* buffer::get_ptr() { return ptr; } -bool buffer_base::get_status() const +bool buffer::get_status() const { return is_free; } -size_t buffer_base::get_size() const +size_t buffer::get_size() const { return allocated_size; } -int buffer_base::get_id() const +int buffer::get_id() const { return id; } -void buffer_base::set_allocated_size(const size_t required_size) +void buffer::set_allocated_size(const size_t required_size) { allocated_size = required_size; } -void buffer_base::set_null_pointer() +void buffer::set_null_pointer() { ptr = nullptr; } -void buffer_base::set_status(const bool status) +void buffer::set_status(const bool status) { is_free = status; } -void buffer_base::set_id(const int idx) +void buffer::set_id(const int idx) { id = idx; -} - -// template< MemType mem > -// void buffer<mem>::reallocate(const size_t required_size) -// { -// memproc::realloc<mem>((void *&)ptr, allocated_size, required_size); -// } - -// template< MemType mem > -// void buffer<mem>::deallocate() -// { -// memproc::deallocate<mem>((void *&)ptr, allocated_size); -// } - -// template class buffer<MemType::CPU>; -// #ifdef INCLUDE_CUDA -// template class buffer<MemType::GPU>; -// #endif \ No newline at end of file +} \ No newline at end of file diff --git a/Lib/buffer.h b/Lib/buffer.h index 9a5addb9fe28bd128bdb341ff4cb275703947495..6f79e98fc5b6c64b1ab39bd548b3d97b32873727 100644 --- a/Lib/buffer.h +++ b/Lib/buffer.h @@ -2,7 +2,7 @@ #include "TemplateParameters.h" #include <cstdlib> -class buffer_base +class buffer { public: void *ptr; @@ -12,11 +12,10 @@ public: int id; MemType mem; - buffer_base(); // Done - buffer_base(const size_t required_size, const MemType mem); // Done - buffer_base(const buffer_base& other); // Done - buffer_base(buffer_base&& other); // Done - ~buffer_base(); // Done + buffer(const size_t required_size, const MemType mem); // Done + buffer(const buffer& other); // Done + buffer(buffer&& other) noexcept; // Done + ~buffer(); // Done bool is_available() const; // Done void* get_ptr(); // Done @@ -29,36 +28,9 @@ public: void set_id(const int id); // Done void set_null_pointer(); // Done - buffer_base& operator=(const buffer_base& other); // Done - buffer_base& operator=(buffer_base&& other); // Done + buffer& operator=(const buffer& other); // Done + buffer& operator=(buffer&& other) noexcept; // Done void reallocate(const size_t required_size); void deallocate(); }; - -// namespace dyn_dispatch_buffer -// { -// void reallocate(buffer_base* obj, const size_t required_size); -// void deallocate(buffer_base* obj); -// }; - -// template< MemType mem > -// class buffer: public buffer_base -// { -// private: -// using buffer_base::ptr; -// using buffer_base::allocated_size; -// using buffer_base::scalar_size; -// using buffer_base::is_free; -// using buffer_base::id; - -// public: -// buffer(const buffer<mem>& other) : buffer_base(other) {} -// buffer(buffer<mem>&& other) : buffer_base(other) {} -// buffer() : buffer_base() {} -// ~buffer(){}; -// buffer(const size_t required_size) : buffer_base(required_size) {} - -// void reallocate(const size_t required_size) override; -// void deallocate() override; -// }; \ No newline at end of file diff --git a/Lib/memory-faucet.cpp b/Lib/memory-faucet.cpp index 911fc8e0f361bc83108bfcae166bc94c487110f5..21d734c94dda92c8cc997e089cb64a00c2f2f697 100644 --- a/Lib/memory-faucet.cpp +++ b/Lib/memory-faucet.cpp @@ -9,7 +9,7 @@ template< MemType mem, buf_choose_policy choose_type > memory_pipe<mem, choose_type>::memory_pipe() { - buff_vec = std::vector<buffer_base > (); + buff_vec = std::vector<buffer > (); } template< MemType mem, buf_choose_policy choose_type > @@ -25,7 +25,7 @@ void memory_pipe<mem, choose_type>::set_available(const int id) } template< MemType mem, buf_choose_policy choose_type > -std::vector<buffer_base >& memory_pipe<mem, choose_type>::get_buff_vec() +std::vector<buffer >& memory_pipe<mem, choose_type>::get_buff_vec() { return buff_vec; } diff --git a/Lib/memory-faucet.h b/Lib/memory-faucet.h index ba99b14d679e41befbc1cad327a3bb8ac5ca2d71..f4c5ba8d249a9ef8336895a99c254e319468b8a1 100644 --- a/Lib/memory-faucet.h +++ b/Lib/memory-faucet.h @@ -5,12 +5,12 @@ template< MemType mem = MemType::CPU, buf_choose_policy choose_type = buf_choose class memory_pipe { private: - std::vector<buffer_base > buff_vec; + std::vector<buffer > buff_vec; public: memory_pipe(/* args */); ~memory_pipe(); void set_available(const int id); - std::vector<buffer_base >& get_buff_vec(); + std::vector<buffer >& get_buff_vec(); }; class memory_faucet diff --git a/Lib/mf-utils.cpp b/Lib/mf-utils.cpp index 5d7e97cf76a9b16c75da8777afee14201605dcbe..9e3ac4d80928df59d92c2a0da6b923f5d6551b17 100644 --- a/Lib/mf-utils.cpp +++ b/Lib/mf-utils.cpp @@ -1,6 +1,6 @@ #include "mf-utils.h" -bool mf_utils::free_size_comparator(const buffer_base& obj, const size_t required_size) +bool mf_utils::free_size_comparator(const buffer& obj, const size_t required_size) { if(obj.get_status() == false) return false; @@ -8,18 +8,18 @@ bool mf_utils::free_size_comparator(const buffer_base& obj, const size_t require return obj.get_size() <= required_size; } -bool mf_utils::size_comparator(const size_t required_size, const buffer_base& obj) +bool mf_utils::size_comparator(const size_t required_size, const buffer& obj) { return required_size < obj.get_size(); } -typename std::vector<buffer_base>::iterator mf_utils::get_lower_bound( - typename std::vector<buffer_base>::iterator first, - typename std::vector<buffer_base>::iterator last, const size_t value, - std::function<bool (const buffer_base&, const size_t) >& comp) +typename std::vector<buffer>::iterator mf_utils::get_lower_bound( + typename std::vector<buffer>::iterator first, + typename std::vector<buffer>::iterator last, const size_t value, + std::function<bool (const buffer&, const size_t) >& comp) { - typename std::vector<buffer_base>::iterator it; - typename std::iterator_traits<typename std::vector<buffer_base>::iterator>::difference_type count, step; + typename std::vector<buffer>::iterator it; + typename std::iterator_traits<typename std::vector<buffer>::iterator>::difference_type count, step; count = std::distance(first, last); while (count > 0) @@ -40,13 +40,13 @@ typename std::vector<buffer_base>::iterator mf_utils::get_lower_bound( return first; } -typename std::vector<buffer_base>::iterator mf_utils::get_upper_bound( - typename std::vector<buffer_base>::iterator first, - typename std::vector<buffer_base>::iterator last, const size_t value, - std::function<bool (const size_t, const buffer_base&) >& comp) +typename std::vector<buffer>::iterator mf_utils::get_upper_bound( + typename std::vector<buffer>::iterator first, + typename std::vector<buffer>::iterator last, const size_t value, + std::function<bool (const size_t, const buffer&) >& comp) { - typename std::vector<buffer_base>::iterator it; - typename std::iterator_traits<typename std::vector<buffer_base>::iterator>::difference_type count, step; + typename std::vector<buffer>::iterator it; + typename std::iterator_traits<typename std::vector<buffer>::iterator>::difference_type count, step; count = std::distance(first, last); while (count > 0) @@ -69,7 +69,7 @@ typename std::vector<buffer_base>::iterator mf_utils::get_upper_bound( template<> int mf_utils::get_buffer<buf_choose_policy::naive>(const size_t required_size, - std::vector<buffer_base>& buff_vec, + std::vector<buffer>& buff_vec, const MemType mem, void ** ptr) { @@ -87,7 +87,7 @@ int mf_utils::get_buffer<buf_choose_policy::naive>(const size_t required_size, } } - buff_vec.push_back(buffer_base(required_size, mem)); + buff_vec.push_back(buffer(required_size, mem)); (*ptr) = buff_vec.back().get_ptr(); int id = buff_vec.size() - 1; @@ -100,7 +100,7 @@ int mf_utils::get_buffer<buf_choose_policy::naive>(const size_t required_size, template<> int mf_utils::get_buffer<buf_choose_policy::sorted_vec>(const size_t required_size, - std::vector<buffer_base>& buff_vec, + std::vector<buffer>& buff_vec, const MemType mem, void ** ptr) { @@ -118,10 +118,10 @@ int mf_utils::get_buffer<buf_choose_policy::sorted_vec>(const size_t required_si } } - typename std::vector<buffer_base>::iterator buf_it; - std::function<bool (const size_t, const buffer_base&) > comparator = mf_utils::size_comparator; + typename std::vector<buffer>::iterator buf_it; + std::function<bool (const size_t, const buffer&) > comparator = mf_utils::size_comparator; buf_it = mf_utils::get_upper_bound (buff_vec.begin(), buff_vec.end(), required_size, comparator); - buf_it = buff_vec.insert(buf_it, buffer_base(required_size, mem)); + buf_it = buff_vec.insert(buf_it, buffer(required_size, mem)); (*ptr) = buf_it->get_ptr(); int id = std::distance(buff_vec.begin(), buf_it); buff_vec.back().set_id(id); @@ -130,12 +130,12 @@ int mf_utils::get_buffer<buf_choose_policy::sorted_vec>(const size_t required_si template<> int mf_utils::get_buffer<buf_choose_policy::find_best_unsorted>(const size_t required_size, - std::vector<buffer_base>& buff_vec, + std::vector<buffer>& buff_vec, const MemType mem, void ** ptr) { - typename std::vector<buffer_base>::iterator available_buf_it; - std::function<bool (const buffer_base&, const size_t) > comparator = mf_utils::free_size_comparator; + typename std::vector<buffer>::iterator available_buf_it; + std::function<bool (const buffer&, const size_t) > comparator = mf_utils::free_size_comparator; available_buf_it = mf_utils::get_lower_bound (buff_vec.begin(), buff_vec.end(), required_size, comparator); if(available_buf_it != buff_vec.end()) { @@ -146,7 +146,7 @@ int mf_utils::get_buffer<buf_choose_policy::find_best_unsorted>(const size_t req } else { - buff_vec.push_back(buffer_base(required_size, mem)); + buff_vec.push_back(buffer(required_size, mem)); (*ptr) = buff_vec.back().get_ptr(); int id = buff_vec.size() - 1; buff_vec.back().set_id(id); diff --git a/Lib/mf-utils.h b/Lib/mf-utils.h index bc059905af8c3173db6ca399036bfd104b92916e..c127bbc2d55eab30dc8bb1772869b218e20b87b3 100644 --- a/Lib/mf-utils.h +++ b/Lib/mf-utils.h @@ -12,22 +12,22 @@ enum class buf_choose_policy namespace mf_utils { - bool free_size_comparator(const buffer_base& obj, const size_t required_size); - bool size_comparator(const size_t required_size, const buffer_base& obj); + bool free_size_comparator(const buffer& obj, const size_t required_size); + bool size_comparator(const size_t required_size, const buffer& obj); - typename std::vector<buffer_base>::iterator get_lower_bound( - typename std::vector<buffer_base>::iterator first, - typename std::vector<buffer_base>::iterator last, const size_t value, - std::function<bool (const buffer_base&, const size_t) >& comp); + typename std::vector<buffer>::iterator get_lower_bound( + typename std::vector<buffer>::iterator first, + typename std::vector<buffer>::iterator last, const size_t value, + std::function<bool (const buffer&, const size_t) >& comp); - typename std::vector<buffer_base>::iterator get_upper_bound( - typename std::vector<buffer_base>::iterator first, - typename std::vector<buffer_base>::iterator last, const size_t value, - std::function<bool (const size_t, const buffer_base&) >& comp); + typename std::vector<buffer>::iterator get_upper_bound( + typename std::vector<buffer>::iterator first, + typename std::vector<buffer>::iterator last, const size_t value, + std::function<bool (const size_t, const buffer&) >& comp); template<buf_choose_policy choose_type = buf_choose_policy::naive> int get_buffer(const size_t required_size, - std::vector<buffer_base>& buff_vec, + std::vector<buffer>& buff_vec, const MemType mem, void ** ptr); } \ No newline at end of file