move StackAllocator to cpp file

it is internal class, no need to export it
This commit is contained in:
Vladislav Vinogradov 2014-12-19 19:33:32 +03:00
parent 7ed38b97c3
commit 05d40946f3
2 changed files with 125 additions and 111 deletions

View File

@ -92,26 +92,6 @@ static inline void throw_no_cuda() { CV_Error(cv::Error::StsNotImplemented, "The
namespace cv { namespace cuda namespace cv { namespace cuda
{ {
class MemoryStack;
class CV_EXPORTS StackAllocator : public GpuMat::Allocator
{
public:
explicit StackAllocator(cudaStream_t stream);
~StackAllocator();
bool allocate(GpuMat* mat, int rows, int cols, size_t elemSize);
void free(GpuMat* mat);
private:
StackAllocator(const StackAllocator&);
StackAllocator& operator =(const StackAllocator&);
cudaStream_t stream_;
MemoryStack* memStack_;
size_t alignment_;
};
class CV_EXPORTS BufferPool class CV_EXPORTS BufferPool
{ {
public: public:
@ -120,6 +100,8 @@ namespace cv { namespace cuda
GpuMat getBuffer(int rows, int cols, int type); GpuMat getBuffer(int rows, int cols, int type);
GpuMat getBuffer(Size size, int type) { return getBuffer(size.height, size.width, type); } GpuMat getBuffer(Size size, int type) { return getBuffer(size.height, size.width, type); }
GpuMat::Allocator* getAllocator() const { return allocator_; }
private: private:
GpuMat::Allocator* allocator_; GpuMat::Allocator* allocator_;
}; };

View File

@ -53,9 +53,8 @@ using namespace cv::cuda;
namespace namespace
{ {
class MemoryPool; class MemoryPool;
}
class cv::cuda::MemoryStack class MemoryStack
{ {
public: public:
uchar* requestMemory(size_t size); uchar* requestMemory(size_t size);
@ -73,7 +72,7 @@ public:
#endif #endif
}; };
uchar* cv::cuda::MemoryStack::requestMemory(size_t size) uchar* MemoryStack::requestMemory(size_t size)
{ {
const size_t freeMem = dataend - tip; const size_t freeMem = dataend - tip;
@ -91,7 +90,7 @@ uchar* cv::cuda::MemoryStack::requestMemory(size_t size)
return ptr; return ptr;
} }
void cv::cuda::MemoryStack::returnMemory(uchar* ptr) void MemoryStack::returnMemory(uchar* ptr)
{ {
CV_DbgAssert( ptr >= datastart && ptr < dataend ); CV_DbgAssert( ptr >= datastart && ptr < dataend );
@ -103,6 +102,7 @@ void cv::cuda::MemoryStack::returnMemory(uchar* ptr)
tip = ptr; tip = ptr;
} }
}
#endif #endif
@ -271,6 +271,11 @@ public:
#else #else
namespace
{
class StackAllocator;
}
class cv::cuda::Stream::Impl class cv::cuda::Stream::Impl
{ {
public: public:
@ -540,9 +545,26 @@ cudaStream_t cv::cuda::StreamAccessor::getStream(const Stream& stream)
namespace namespace
{ {
bool enableMemoryPool = true; bool enableMemoryPool = true;
}
cv::cuda::StackAllocator::StackAllocator(cudaStream_t stream) : stream_(stream), memStack_(0) class StackAllocator : public GpuMat::Allocator
{
public:
explicit StackAllocator(cudaStream_t stream);
~StackAllocator();
bool allocate(GpuMat* mat, int rows, int cols, size_t elemSize);
void free(GpuMat* mat);
private:
StackAllocator(const StackAllocator&);
StackAllocator& operator =(const StackAllocator&);
cudaStream_t stream_;
MemoryStack* memStack_;
size_t alignment_;
};
StackAllocator::StackAllocator(cudaStream_t stream) : stream_(stream), memStack_(0)
{ {
if (enableMemoryPool) if (enableMemoryPool)
{ {
@ -553,7 +575,7 @@ cv::cuda::StackAllocator::StackAllocator(cudaStream_t stream) : stream_(stream),
} }
} }
cv::cuda::StackAllocator::~StackAllocator() StackAllocator::~StackAllocator()
{ {
cudaStreamSynchronize(stream_); cudaStreamSynchronize(stream_);
@ -561,8 +583,6 @@ cv::cuda::StackAllocator::~StackAllocator()
memStack_->pool->returnMemStack(memStack_); memStack_->pool->returnMemStack(memStack_);
} }
namespace
{
size_t alignUp(size_t what, size_t alignment) size_t alignUp(size_t what, size_t alignment)
{ {
size_t alignMask = alignment-1; size_t alignMask = alignment-1;
@ -570,9 +590,8 @@ namespace
size_t res = (what + alignMask) & inverseAlignMask; size_t res = (what + alignMask) & inverseAlignMask;
return res; return res;
} }
}
bool cv::cuda::StackAllocator::allocate(GpuMat* mat, int rows, int cols, size_t elemSize) bool StackAllocator::allocate(GpuMat* mat, int rows, int cols, size_t elemSize)
{ {
if (memStack_ == 0) if (memStack_ == 0)
return false; return false;
@ -603,7 +622,7 @@ bool cv::cuda::StackAllocator::allocate(GpuMat* mat, int rows, int cols, size_t
return true; return true;
} }
void cv::cuda::StackAllocator::free(GpuMat* mat) void StackAllocator::free(GpuMat* mat)
{ {
if (memStack_ == 0) if (memStack_ == 0)
return; return;
@ -611,14 +630,31 @@ void cv::cuda::StackAllocator::free(GpuMat* mat)
memStack_->returnMemory(mat->datastart); memStack_->returnMemory(mat->datastart);
fastFree(mat->refcount); fastFree(mat->refcount);
} }
}
#endif
/////////////////////////////////////////////////////////////
/// BufferPool
void cv::cuda::setBufferPoolUsage(bool on) void cv::cuda::setBufferPoolUsage(bool on)
{ {
#ifndef HAVE_CUDA
(void)on;
throw_no_cuda();
#else
enableMemoryPool = on; enableMemoryPool = on;
#endif
} }
void cv::cuda::setBufferPoolConfig(int deviceId, size_t stackSize, int stackCount) void cv::cuda::setBufferPoolConfig(int deviceId, size_t stackSize, int stackCount)
{ {
#ifndef HAVE_CUDA
(void)deviceId;
(void)stackSize;
(void)stackCount;
throw_no_cuda();
#else
const int currentDevice = getDevice(); const int currentDevice = getDevice();
if (deviceId >= 0) if (deviceId >= 0)
@ -638,12 +674,8 @@ void cv::cuda::setBufferPoolConfig(int deviceId, size_t stackSize, int stackCoun
} }
setDevice(currentDevice); setDevice(currentDevice);
}
#endif #endif
}
/////////////////////////////////////////////////////////////
/// BufferPool
#ifdef HAVE_CUDA #ifdef HAVE_CUDA