Newer
Older
/*
* HeapMemory.cpp
*
* Created on: Aug 17, 2014
* Author: Pietro Incardona
*/
#include "HeapMemory.hpp"

Pietro Incardona
committed
#include <cstddef>
#include <cstring>
#include <iostream>
#include <cstdint>
/*! \brief fill host and device memory with the selected byte
*
* \param byte to fill
*
*/
void HeapMemory::fill(unsigned char c)
{
memset(dm,c,size());
}

Pietro Incardona
committed
/*! \brief Allocate a chunk of memory
*
* \param sz size of the chunk of memory to allocate in byte
*
*/

Pietro Incardona
committed
bool HeapMemory::allocate(size_t sz)
{
//! Allocate the device memory
if (dm == NULL)
{
dmOrig = new byte[sz+alignement+extra_pad];
#ifdef GARBAGE_INJECTOR
memset(dmOrig,0xFF,sz+alignement+extra_pad);
#endif
}

Pietro Incardona
committed
else
std::cerr << __FILE__ << ":" << __LINE__ << " error memory already allocated\n";

Pietro Incardona
committed
dm = dmOrig;
// align it, we do not know the size of the element we put 1
// and we ignore the align check
size_t sz_a = sz+alignement;
align(alignement,1,(void *&)dm,sz_a);

Pietro Incardona
committed
this->sz = sz;
return true;
}
/*! \brief set the memory block to be aligned by this number
*
*/
void HeapMemory::setAlignment(size_t align)
{
this->alignement = align;
}

Pietro Incardona
committed
*
*
*/
void HeapMemory::destroy()
{

Pietro Incardona
committed
if (dmOrig != NULL)
delete [] dmOrig;

Pietro Incardona
committed
}
/*! \brief copy the data from a pointer
*
*
* \param ptr
*/
bool HeapMemory::copyFromPointer(const void * ptr,size_t sz)

Pietro Incardona
committed
{

Pietro Incardona
committed
}
/*! \brief copy from device to device
*
* copy a piece of memory from device to device
*

Pietro Incardona
committed
*
*/
bool HeapMemory::copyDeviceToDevice(const HeapMemory & m)

Pietro Incardona
committed
{
//! The source buffer is too big to copy it
if (m.sz > sz)
{
std::cerr << "Error " << __LINE__ << __FILE__ << ": source buffer is too big to copy";

Pietro Incardona
committed
}
// Copy the memory from m
memcpy(dm,m.dm,m.sz);
return true;

Pietro Incardona
committed
}

Pietro Incardona
committed
*
* \param m a memory interface
*
*/
bool HeapMemory::copy(const memory & m)

Pietro Incardona
committed
{
const HeapMemory * ofpm = dynamic_cast<const HeapMemory *>(&m);

Pietro Incardona
committed
//! if we fail we get the pointer and simply copy from the pointer
if (ofpm == NULL)
{
// copy the memory from device to host and from host to device

Pietro Incardona
committed
}
else
{
// they are the same memory type, use cuda/thrust buffer copy
return copyDeviceToDevice(*ofpm);
}
return false;
}
/*! \brief Get the size of the allocated memory
*
* Get the size of the allocated memory
*
* \return the size of the allocated memory
*
*/

Pietro Incardona
committed
{
return sz;
}
/*! \brief Resize the allocated memory
*
* Resize the allocated memory, if request is smaller than the allocated memory
* is not resized
*
* \param sz size
* \return true if the resize operation complete correctly
*
*/
bool HeapMemory::resize(size_t sz)
{

Pietro Incardona
committed
//! Allocate the device memory if not done yet
if (HeapMemory::size() == 0)
return HeapMemory::allocate(sz);

Pietro Incardona
committed
//! Create a new buffer if sz is bigger than the actual size
tdmOrig = new byte[sz+alignement+extra_pad];
#ifdef GARBAGE_INJECTOR
memset(tdmOrig,0xFF,sz+alignement+extra_pad);
#endif
tdm = tdmOrig;
//! size plus alignment
size_t sz_a = sz+alignement;
//! align it
align(alignement,1,(void *&)tdm,sz_a);

Pietro Incardona
committed
//! copy from the old buffer to the new one

Pietro Incardona
committed

Pietro Incardona
committed
this->sz = sz;

Pietro Incardona
committed
//! free the old buffer

Pietro Incardona
committed
//! change to the new buffer
dm = tdm;

Pietro Incardona
committed
return true;
}
/*! \brief Return a readable pointer with your data
*
* Return a readable pointer with your data
*
*/
void * HeapMemory::getDevicePointer()
{
return dm;
}

Pietro Incardona
committed
/*! \brief Return a readable pointer with your data
*
* Return a readable pointer with your data
*
*/
void * HeapMemory::getPointer()
{
return dm;
}