Skip to content
Snippets Groups Projects
memory-faucet.cpp 4.22 KiB
Newer Older
  • Learn to ignore specific revisions
  • 数学の武士's avatar
    数学の武士 committed
    #include "memory-faucet.h"
    
    数学の武士's avatar
    数学の武士 committed
    #include "mf-utils.h"
    
    
    数学の武士's avatar
    .
    数学の武士 committed
    #include "MemoryProcessing.h"
    #ifdef INCLUDE_CUDA
    #include "MemoryProcessing.cuh"
    #endif
    
    数学の武士's avatar
    数学の武士 committed
    
    
    数学の武士's avatar
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    memory_pipe<mem, choose_type>::memory_pipe()
    
    数学の武士's avatar
    .
    数学の武士 committed
    {
    
        buff_vec = std::vector<buffer > ();
    
    数学の武士's avatar
    .
    数学の武士 committed
    }
    
    
    数学の武士's avatar
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    memory_pipe<mem, choose_type>::~memory_pipe()
    
    数学の武士's avatar
    .
    数学の武士 committed
    {
    
    数学の武士's avatar
    数学の武士 committed
        buff_vec.clear();
    
    数学の武士's avatar
    .
    数学の武士 committed
    }
    
    
    数学の武士's avatar
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    void memory_pipe<mem, choose_type>::set_available(const int id)
    
    数学の武士's avatar
    .  
    数学の武士 committed
    {
    
    数学の武士's avatar
    数学の武士 committed
        buff_vec[id].set_status(true);
    
    数学の武士's avatar
    .  
    数学の武士 committed
    }
    
    
    数学の武士's avatar
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    
    std::vector<buffer >& memory_pipe<mem, choose_type>::get_buff_vec()
    
    数学の武士's avatar
    .  
    数学の武士 committed
    {
    
    数学の武士's avatar
    数学の武士 committed
        return buff_vec;
    
    数学の武士's avatar
    .  
    数学の武士 committed
    }
    
    
    数学の武士's avatar
    数学の武士 committed
    template class memory_pipe<MemType::CPU, buf_choose_policy::naive>;
    template class memory_pipe<MemType::CPU, buf_choose_policy::sorted_vec>;
    template class memory_pipe<MemType::CPU, buf_choose_policy::find_best_unsorted>;
    
    数学の武士's avatar
    .  
    数学の武士 committed
    
    #ifdef INCLUDE_CUDA
    
    数学の武士's avatar
    数学の武士 committed
    template class memory_pipe<MemType::GPU, buf_choose_policy::naive>;
    template class memory_pipe<MemType::GPU, buf_choose_policy::sorted_vec>;
    template class memory_pipe<MemType::GPU, buf_choose_policy::find_best_unsorted>;
    
    数学の武士's avatar
    .  
    数学の武士 committed
    #endif
    
    
    
    数学の武士's avatar
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    memory_pipe<mem, choose_type>& memory_faucet::get_faucet()
    
    数学の武士's avatar
    .  
    数学の武士 committed
    {
    
    数学の武士's avatar
    数学の武士 committed
        static memory_pipe<mem, choose_type> mem_pipe = memory_pipe<mem, choose_type>();
        return mem_pipe;
    
    数学の武士's avatar
    .  
    数学の武士 committed
    }
    
    
    数学の武士's avatar
    数学の武士 committed
    template memory_pipe<MemType::CPU, buf_choose_policy::naive>& memory_faucet::get_faucet();
    template memory_pipe<MemType::CPU, buf_choose_policy::sorted_vec>& memory_faucet::get_faucet();
    template memory_pipe<MemType::CPU, buf_choose_policy::find_best_unsorted>& memory_faucet::get_faucet();
    
    数学の武士's avatar
    .
    数学の武士 committed
    
    
    数学の武士's avatar
    .  
    数学の武士 committed
    #ifdef INCLUDE_CUDA
    
    数学の武士's avatar
    数学の武士 committed
    template memory_pipe<MemType::GPU, buf_choose_policy::naive>& memory_faucet::get_faucet();
    template memory_pipe<MemType::GPU, buf_choose_policy::sorted_vec>& memory_faucet::get_faucet();
    template memory_pipe<MemType::GPU, buf_choose_policy::find_best_unsorted>& memory_faucet::get_faucet();
    
    数学の武士's avatar
    .  
    数学の武士 committed
    #endif
    
    数学の武士's avatar
    .
    数学の武士 committed
    
    
    数学の武士's avatar
    .  
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    memBuf<mem, choose_type>::memBuf(const size_t required_size)
    
    数学の武士's avatar
    .
    数学の武士 committed
    {
    
    数学の武士's avatar
    数学の武士 committed
        memory_pipe<mem, choose_type>& mem_pipe = memory_faucet::get_faucet<mem, choose_type>();
        id = mf_utils::get_buffer<choose_type>(required_size, mem_pipe.get_buff_vec(), mem, &buf);
    
    数学の武士's avatar
    .
    数学の武士 committed
        size = required_size;
    }
    
    
    数学の武士's avatar
    .  
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    
    数学の武士's avatar
    数学の武士 committed
    void memBuf<mem, choose_type>::free_memory()
    
    数学の武士's avatar
    .
    数学の武士 committed
    {
    
    数学の武士's avatar
    数学の武士 committed
        if(id == -1)
        {
            return;
        }
    
    
    数学の武士's avatar
    数学の武士 committed
        memory_pipe<mem, choose_type>& mem_pipe = memory_faucet::get_faucet<mem, choose_type>();
        mem_pipe.set_available(id);
    
    数学の武士's avatar
    .  
    数学の武士 committed
        buf = nullptr;
    
    数学の武士's avatar
    .
    数学の武士 committed
    }
    
    
    数学の武士's avatar
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    memBuf<mem, choose_type>::~memBuf()
    {
        free_memory();
    }
    
    
    数学の武士's avatar
    .  
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    
    数学の武士's avatar
    .  
    数学の武士 committed
    void* memBuf<mem, choose_type>::ptr()
    {
        return buf;
    }
    
    
    数学の武士's avatar
    .  
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    void** memBuf<mem, choose_type>::ptr()
    {
        return &buf;
    }
    
    
    数学の武士's avatar
    .  
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    const void* memBuf<mem, choose_type>::ptr() const
    
    数学の武士's avatar
    .
    数学の武士 committed
    {
        return buf;
    }
    
    
    数学の武士's avatar
    .  
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    
    数学の武士's avatar
    数学の武士 committed
    int memBuf<mem, choose_type>::get_size() const
    
    数学の武士's avatar
    .
    数学の武士 committed
    {
        return size;
    }
    
    
    template< MemType mem, buf_choose_policy choose_type >
    int memBuf<mem, choose_type>::get_id() const
    {
        return id;
    }
    
    
    数学の武士's avatar
    数学の武士 committed
    template< MemType mem, buf_choose_policy choose_type >
    memBuf<mem, choose_type>::memBuf() 
    {
        buf = nullptr;
        id = -1;
        size = 0;
    }
    
    template< MemType mem, buf_choose_policy choose_type >
    void memBuf<mem, choose_type>::get_memory(const size_t required_size) 
    {
        free_memory();
    
        memory_pipe<mem, choose_type>& mem_pipe = memory_faucet::get_faucet<mem, choose_type>();
        id = mf_utils::get_buffer<choose_type>(required_size, mem_pipe.get_buff_vec(), mem, &buf);
        size = required_size;
    }
    
    
    数学の武士's avatar
    .  
    数学の武士 committed
    template class memBuf<MemType::CPU, buf_choose_policy::naive>;
    
    数学の武士's avatar
    .  
    数学の武士 committed
    template class memBuf<MemType::CPU, buf_choose_policy::sorted_vec>;
    template class memBuf<MemType::CPU, buf_choose_policy::find_best_unsorted>;
    
    
    数学の武士's avatar
    .  
    数学の武士 committed
    #ifdef INCLUDE_CUDA
    
    数学の武士's avatar
    .  
    数学の武士 committed
    template class memBuf<MemType::GPU, buf_choose_policy::naive>;
    
    数学の武士's avatar
    .  
    数学の武士 committed
    template class memBuf<MemType::GPU, buf_choose_policy::sorted_vec>;
    template class memBuf<MemType::GPU, buf_choose_policy::find_best_unsorted>;
    
    数学の武士's avatar
    .  
    数学の武士 committed
    #endif