Alien-XGBoost
view release on metacpan or search on metacpan
xgboost/cub/cub/util_allocator.cuh view on Meta::CPAN
//---------------------------------------------------------------------
// Type definitions and helper types
//---------------------------------------------------------------------
/**
* Descriptor for device memory allocations
*/
struct BlockDescriptor
{
void* d_ptr; // Device pointer
size_t bytes; // Size of allocation in bytes
unsigned int bin; // Bin enumeration
int device; // device ordinal
cudaStream_t associated_stream; // Associated associated_stream
cudaEvent_t ready_event; // Signal when associated stream has run to the point at which this block was freed
// Constructor (suitable for searching maps for a specific block, given its pointer and device)
BlockDescriptor(void *d_ptr, int device) :
d_ptr(d_ptr),
bytes(0),
bin(INVALID_BIN),
device(device),
associated_stream(0),
ready_event(0)
{}
// Constructor (suitable for searching maps for a range of suitable blocks, given a device)
BlockDescriptor(int device) :
d_ptr(NULL),
bytes(0),
bin(INVALID_BIN),
device(device),
associated_stream(0),
ready_event(0)
{}
// Comparison functor for comparing device pointers
static bool PtrCompare(const BlockDescriptor &a, const BlockDescriptor &b)
{
if (a.device == b.device)
return (a.d_ptr < b.d_ptr);
else
return (a.device < b.device);
}
// Comparison functor for comparing allocation sizes
static bool SizeCompare(const BlockDescriptor &a, const BlockDescriptor &b)
{
if (a.device == b.device)
return (a.bytes < b.bytes);
else
return (a.device < b.device);
}
};
/// BlockDescriptor comparator function interface
typedef bool (*Compare)(const BlockDescriptor &, const BlockDescriptor &);
class TotalBytes {
public:
size_t free;
size_t live;
TotalBytes() { free = live = 0; }
};
/// Set type for cached blocks (ordered by size)
typedef std::multiset<BlockDescriptor, Compare> CachedBlocks;
/// Set type for live blocks (ordered by ptr)
typedef std::multiset<BlockDescriptor, Compare> BusyBlocks;
/// Map type of device ordinals to the number of cached bytes cached by each device
typedef std::map<int, TotalBytes> GpuCachedBytes;
//---------------------------------------------------------------------
// Utility functions
//---------------------------------------------------------------------
/**
* Integer pow function for unsigned base and exponent
*/
static unsigned int IntPow(
unsigned int base,
unsigned int exp)
{
unsigned int retval = 1;
while (exp > 0)
{
if (exp & 1) {
retval = retval * base; // multiply the result by the current base
}
base = base * base; // square the base
exp = exp >> 1; // divide the exponent in half
}
return retval;
}
/**
* Round up to the nearest power-of
*/
void NearestPowerOf(
unsigned int &power,
size_t &rounded_bytes,
unsigned int base,
size_t value)
{
power = 0;
rounded_bytes = 1;
if (value * base < value)
{
// Overflow
power = sizeof(size_t) * 8;
rounded_bytes = size_t(0) - 1;
return;
}
while (rounded_bytes < value)
( run in 0.420 second using v1.01-cache-2.11-cpan-d7f47b0818f )