Skip to content
Snippets Groups Projects
memory-holder.h 3.2 KiB
Newer Older
数学の武士's avatar
.
数学の武士 committed
#pragma once
#include <cstdlib>
#include <vector>
数学の武士's avatar
.  
数学の武士 committed
#include <functional>

数学の武士's avatar
.
数学の武士 committed
#include "TemplateParameters.h"

enum class buf_choose_policy
{
    naiv,
    sorted_vec,
数学の武士's avatar
.  
数学の武士 committed
    find_best_unsorted
数学の武士's avatar
.
数学の武士 committed
};

template< MemType mem >
class buffer
{
private:
    void *ptr;
    size_t allocated_size;
    size_t scalar_size;
    bool is_free;
    int id;

public:
数学の武士's avatar
.  
数学の武士 committed
    buffer(const buffer<mem>& other);
数学の武士's avatar
.
数学の武士 committed
    buffer();
    ~buffer();
    buffer(const size_t required_size);

    bool is_available() const;
数学の武士's avatar
.  
数学の武士 committed
    void* get_ptr();
数学の武士's avatar
.
数学の武士 committed
    bool get_status() const;
    size_t get_size() const;
数学の武士's avatar
.  
数学の武士 committed
    int get_id() const;
数学の武士's avatar
.
数学の武士 committed
    buffer<mem>& operator=(buffer<mem>& other);
数学の武士's avatar
.  
数学の武士 committed
    buffer<mem>& operator=(const buffer<mem>& other);
数学の武士's avatar
.
数学の武士 committed
    void reallocate(const size_t required_size);
数学の武士's avatar
.  
数学の武士 committed
    void set_allocated_size(const size_t required_size);
数学の武士's avatar
.
数学の武士 committed
    void set_status(const bool status);
    void set_id(const int id);
};

数学の武士's avatar
.  
数学の武士 committed
class memory_pipline_base
数学の武士's avatar
.
数学の武士 committed
{
数学の武士's avatar
.  
数学の武士 committed
public:
数学の武士's avatar
.  
数学の武士 committed
#ifdef INCLUDE_CUDA
数学の武士's avatar
.
数学の武士 committed
    std::vector<buffer<MemType::GPU> > gpu_buff;
数学の武士's avatar
.  
数学の武士 committed
#endif
数学の武士's avatar
.
数学の武士 committed
    std::vector<buffer<MemType::CPU> > cpu_buff;
数学の武士's avatar
.  
数学の武士 committed

    memory_pipline_base();
    ~memory_pipline_base();

    template< MemType mem >
    void set_available(const int id);

    template< MemType mem >
    std::vector<buffer<mem> >& get_memtyped_vector();
};

template<buf_choose_policy choose_type = buf_choose_policy::naiv>
class memory_pipline: public memory_pipline_base 
{
private:
#ifdef INCLUDE_CUDA
    using memory_pipline_base::gpu_buff;
#endif
    using memory_pipline_base::cpu_buff;
数学の武士's avatar
.
数学の武士 committed
public:
数学の武士's avatar
.  
数学の武士 committed
    memory_pipline(/* args */) : memory_pipline_base() {}
    ~memory_pipline() = default;
数学の武士's avatar
.
数学の武士 committed

    template< MemType mem >
数学の武士's avatar
.  
数学の武士 committed
    int get_buffer(const size_t required_size, void *& ptr);
数学の武士's avatar
.  
数学の武士 committed
};

template<>
class memory_pipline<buf_choose_policy::sorted_vec>: public memory_pipline_base 
{
private:
#ifdef INCLUDE_CUDA
    using memory_pipline_base::gpu_buff;
#endif
    using memory_pipline_base::cpu_buff;
public:
    memory_pipline(/* args */) : memory_pipline_base() {}
    ~memory_pipline() = default;
数学の武士's avatar
.
数学の武士 committed

    template< MemType mem >
数学の武士's avatar
.  
数学の武士 committed
    int get_buffer(const size_t required_size, void *& ptr);
};

template<>
class memory_pipline<buf_choose_policy::find_best_unsorted>: public memory_pipline_base 
{
private:
#ifdef INCLUDE_CUDA
    using memory_pipline_base::gpu_buff;
#endif
    using memory_pipline_base::cpu_buff;
public:
    memory_pipline(/* args */) : memory_pipline_base() {}
    ~memory_pipline() = default;
数学の武士's avatar
.
数学の武士 committed

    template< MemType mem >
数学の武士's avatar
.  
数学の武士 committed
    int get_buffer(const size_t required_size, void *& ptr);
数学の武士's avatar
.
数学の武士 committed
};

class memory_faucet
{
private:
数学の武士's avatar
.  
数学の武士 committed
    memory_faucet() = delete;
数学の武士's avatar
.
数学の武士 committed
    memory_faucet(const memory_faucet&) = delete;
    memory_faucet& operator=(const memory_faucet&) = delete;

数学の武士's avatar
.  
数学の武士 committed
    static memory_pipline<buf_choose_policy::naiv>* mem_pipe_naiv;
    static memory_pipline<buf_choose_policy::sorted_vec>* mem_pipe_sorted;
    static memory_pipline<buf_choose_policy::find_best_unsorted>* mem_pipe_unsorted;
数学の武士's avatar
.
数学の武士 committed

public:
数学の武士's avatar
.  
数学の武士 committed

    template<buf_choose_policy choose_type = buf_choose_policy::naiv>
    static memory_pipline<choose_type>* get_faucet();
数学の武士's avatar
.
数学の武士 committed
};

数学の武士's avatar
.  
数学の武士 committed
template< MemType mem, buf_choose_policy choose_type = buf_choose_policy::naiv >
数学の武士's avatar
.
数学の武士 committed
class memBuf
{
private:
    void* buf;
    int id;
    size_t size;

public:
    memBuf(const size_t required_size);
    ~memBuf();
    void* ptr();
    int get_size();
};