final version for a while
parent
5b6924574a
commit
9f617ca3f4
|
@ -1,5 +1,5 @@
|
||||||
cmake_minimum_required(VERSION 3.25)
|
cmake_minimum_required(VERSION 3.25)
|
||||||
project(blt-gp VERSION 0.0.76)
|
project(blt-gp VERSION 0.0.77)
|
||||||
|
|
||||||
include(CTest)
|
include(CTest)
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ blt::gp::prog_config_t config = blt::gp::prog_config_t()
|
||||||
.set_initial_max_tree_size(6)
|
.set_initial_max_tree_size(6)
|
||||||
.set_elite_count(0)
|
.set_elite_count(0)
|
||||||
.set_max_generations(50)
|
.set_max_generations(50)
|
||||||
.set_pop_size(5000)
|
.set_pop_size(500)
|
||||||
.set_thread_count(0);
|
.set_thread_count(0);
|
||||||
|
|
||||||
blt::gp::type_provider type_system;
|
blt::gp::type_provider type_system;
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <blt/std/types.h>
|
#include <blt/std/types.h>
|
||||||
#include <blt/std/assert.h>
|
#include <blt/std/assert.h>
|
||||||
#include <blt/std/logging.h>
|
#include <blt/std/logging.h>
|
||||||
|
#include <blt/std/allocator.h>
|
||||||
#include <blt/gp/fwdecl.h>
|
#include <blt/gp/fwdecl.h>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
@ -32,6 +33,110 @@
|
||||||
|
|
||||||
namespace blt::gp
|
namespace blt::gp
|
||||||
{
|
{
|
||||||
|
class huge_allocator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
constexpr static blt::size_t HUGE_PAGE_SIZE = BLT_2MB_SIZE;
|
||||||
|
static_assert(((HUGE_PAGE_SIZE & (HUGE_PAGE_SIZE - 1)) == 0) && "Must be a power of two!");
|
||||||
|
|
||||||
|
void* allocate(blt::size_t bytes)
|
||||||
|
{
|
||||||
|
std::scoped_lock lock(mutex);
|
||||||
|
if (bytes > HUGE_PAGE_SIZE)
|
||||||
|
throw std::runtime_error("Unable to allocate more than 2mb of space at a time!");
|
||||||
|
if (head == nullptr || head.load()->remaining_bytes() < bytes)
|
||||||
|
push_block();
|
||||||
|
auto ptr = head.load()->metadata.offset;
|
||||||
|
head.load()->metadata.offset += bytes;
|
||||||
|
head.load()->metadata.allocated_objects++;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void deallocate(void* ptr)
|
||||||
|
{
|
||||||
|
std::scoped_lock lock(mutex);
|
||||||
|
auto block = to_block(ptr);
|
||||||
|
block->metadata.allocated_objects--;
|
||||||
|
if (block->metadata.allocated_objects == 0)
|
||||||
|
delete_block(block);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct block
|
||||||
|
{
|
||||||
|
struct block_metadata_t
|
||||||
|
{
|
||||||
|
blt::ptrdiff_t allocated_objects = 0;
|
||||||
|
block* next = nullptr;
|
||||||
|
block* prev = nullptr;
|
||||||
|
blt::u8* offset = nullptr;
|
||||||
|
} metadata;
|
||||||
|
blt::u8 buffer[HUGE_PAGE_SIZE - sizeof(block_metadata_t)]{};
|
||||||
|
|
||||||
|
block()
|
||||||
|
{
|
||||||
|
metadata.offset = buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset()
|
||||||
|
{
|
||||||
|
metadata.allocated_objects = 0;
|
||||||
|
metadata.offset = buffer;
|
||||||
|
metadata.next = nullptr;
|
||||||
|
metadata.prev = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
blt::size_t remaining_bytes()
|
||||||
|
{
|
||||||
|
static constexpr blt::size_t BLOCK_REMAINDER = HUGE_PAGE_SIZE - sizeof(block_metadata_t);
|
||||||
|
return BLOCK_REMAINDER - static_cast<blt::ptrdiff_t>(metadata.offset - buffer);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static inline block* to_block(T* p)
|
||||||
|
{
|
||||||
|
return reinterpret_cast<block*>(reinterpret_cast<std::uintptr_t>(p) & static_cast<std::uintptr_t>(~(HUGE_PAGE_SIZE - 1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void delete_block(block* b)
|
||||||
|
{
|
||||||
|
if (b->metadata.prev != nullptr)
|
||||||
|
b->metadata.prev->metadata.next = b->metadata.next;
|
||||||
|
deallocated_blocks.push_back(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
void push_block()
|
||||||
|
{
|
||||||
|
block * block;
|
||||||
|
if (deallocated_blocks.empty())
|
||||||
|
block = allocate_block();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
block = deallocated_blocks.back();
|
||||||
|
deallocated_blocks.pop_back();
|
||||||
|
block->reset();
|
||||||
|
}
|
||||||
|
block->metadata.prev = head;
|
||||||
|
if (head != nullptr)
|
||||||
|
head.load()->metadata.next = block;
|
||||||
|
head = block;
|
||||||
|
}
|
||||||
|
|
||||||
|
static block* allocate_block()
|
||||||
|
{
|
||||||
|
auto* buffer = reinterpret_cast<block*>(std::aligned_alloc(HUGE_PAGE_SIZE, HUGE_PAGE_SIZE));
|
||||||
|
new(buffer) block{};
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::atomic<block*> head = nullptr;
|
||||||
|
std::mutex mutex;
|
||||||
|
std::vector<block*> deallocated_blocks;
|
||||||
|
};
|
||||||
|
|
||||||
|
huge_allocator& get_allocator();
|
||||||
|
|
||||||
class stack_allocator
|
class stack_allocator
|
||||||
{
|
{
|
||||||
constexpr static blt::size_t PAGE_SIZE = 0x1000;
|
constexpr static blt::size_t PAGE_SIZE = 0x1000;
|
||||||
|
@ -380,6 +485,7 @@ namespace blt::gp
|
||||||
{
|
{
|
||||||
auto size = to_nearest_page_size(bytes);
|
auto size = to_nearest_page_size(bytes);
|
||||||
auto* data = std::aligned_alloc(PAGE_SIZE, size);
|
auto* data = std::aligned_alloc(PAGE_SIZE, size);
|
||||||
|
//auto* data = get_allocator().allocate(size);
|
||||||
new(data) block{size};
|
new(data) block{size};
|
||||||
return reinterpret_cast<block*>(data);
|
return reinterpret_cast<block*>(data);
|
||||||
}
|
}
|
||||||
|
@ -391,6 +497,7 @@ namespace blt::gp
|
||||||
block* ptr = current;
|
block* ptr = current;
|
||||||
current = current->metadata.prev;
|
current = current->metadata.prev;
|
||||||
std::free(ptr);
|
std::free(ptr);
|
||||||
|
//get_allocator().deallocate(ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -403,7 +510,7 @@ namespace blt::gp
|
||||||
head = old;
|
head = old;
|
||||||
head->reset();
|
head->reset();
|
||||||
}
|
}
|
||||||
//free_chain(old);
|
//free_chain(old);
|
||||||
// required to prevent silly memory :3
|
// required to prevent silly memory :3
|
||||||
// if (head != nullptr)
|
// if (head != nullptr)
|
||||||
// head->metadata.next = nullptr;
|
// head->metadata.next = nullptr;
|
||||||
|
|
2
lib/blt
2
lib/blt
|
@ -1 +1 @@
|
||||||
Subproject commit 9a437ec75a41cc32e716da7d88cf36007f30f268
|
Subproject commit 60f77961fbbd4a1a06adbef984d838c5b49b3718
|
|
@ -73,4 +73,10 @@ namespace blt::gp
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
huge_allocator& get_allocator()
|
||||||
|
{
|
||||||
|
static huge_allocator alloc;
|
||||||
|
return alloc;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue