Commit 9ccf27c7 authored by yao's avatar yao

add interfaces enable custom oclMat device memory type

parent 620c6994
...@@ -66,6 +66,32 @@ namespace cv ...@@ -66,6 +66,32 @@ namespace cv
//CVCL_DEVICE_TYPE_CUSTOM = (1 << 4) //CVCL_DEVICE_TYPE_CUSTOM = (1 << 4)
CVCL_DEVICE_TYPE_ALL = 0xFFFFFFFF CVCL_DEVICE_TYPE_ALL = 0xFFFFFFFF
}; };
enum DevMemRW
{
DEVICE_MEM_R_W = 0,
DEVICE_MEM_R_ONLY,
DEVICE_MEM_W_ONLY
};
enum DevMemType
{
DEVICE_MEM_DEFAULT = 0,
DEVICE_MEM_AHP, //alloc host pointer
DEVICE_MEM_UHP, //use host pointer
DEVICE_MEM_CHP, //copy host pointer
DEVICE_MEM_PM //persistent memory
};
//Get the global device memory and read/write type
//return 1 if unified memory system supported, otherwise return 0
CV_EXPORTS int getDevMemType(DevMemRW& rw_type, DevMemType& mem_type);
//Set the global device memory and read/write type,
//the newly generated oclMat will all use this type
//return -1 if the target type is unsupported, otherwise return 0
CV_EXPORTS int setDevMemType(DevMemRW rw_type = DEVICE_MEM_R_W, DevMemType mem_type = DEVICE_MEM_DEFAULT);
//this class contains ocl runtime information //this class contains ocl runtime information
class CV_EXPORTS Info class CV_EXPORTS Info
{ {
...@@ -228,6 +254,11 @@ namespace cv ...@@ -228,6 +254,11 @@ namespace cv
// previous data is unreferenced if needed. // previous data is unreferenced if needed.
void create(int rows, int cols, int type); void create(int rows, int cols, int type);
void create(Size size, int type); void create(Size size, int type);
//! allocates new oclMatrix with specified device memory type.
void createEx(int rows, int cols, int type, DevMemRW rw_type, DevMemType mem_type);
void createEx(Size size, int type, DevMemRW rw_type, DevMemType mem_type);
//! decreases reference counter; //! decreases reference counter;
// deallocate the data when reference counter reaches 0. // deallocate the data when reference counter reaches 0.
void release(); void release();
......
...@@ -72,6 +72,15 @@ namespace cv ...@@ -72,6 +72,15 @@ namespace cv
*/ */
auto_ptr<ProgramCache> ProgramCache::programCache; auto_ptr<ProgramCache> ProgramCache::programCache;
ProgramCache *programCache = NULL; ProgramCache *programCache = NULL;
DevMemType gDeviceMemType = DEVICE_MEM_DEFAULT;
DevMemRW gDeviceMemRW = DEVICE_MEM_R_W;
int gDevMemTypeValueMap[5] = {0,
CL_MEM_ALLOC_HOST_PTR,
CL_MEM_USE_HOST_PTR,
CL_MEM_COPY_HOST_PTR,
CL_MEM_USE_PERSISTENT_MEM_AMD};
int gDevMemRWValueMap[3] = {CL_MEM_READ_WRITE, CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY};
ProgramCache::ProgramCache() ProgramCache::ProgramCache()
{ {
codeCache.clear(); codeCache.clear();
...@@ -113,30 +122,25 @@ namespace cv ...@@ -113,30 +122,25 @@ namespace cv
} }
////////////////////////Common OpenCL specific calls/////////////// ////////////////////////Common OpenCL specific calls///////////////
//Info::Info() int getDevMemType(DevMemRW& rw_type, DevMemType& mem_type)
//{ {
// oclplatform = 0; rw_type = gDeviceMemRW;
// oclcontext = 0; mem_type = gDeviceMemType;
// devnum = 0; return Context::getContext()->impl->unified_memory;
//} }
//Info::~Info()
//{ int setDevMemType(DevMemRW rw_type, DevMemType mem_type)
// release(); {
//} if( (mem_type == DEVICE_MEM_PM && Context::getContext()->impl->unified_memory == 0) ||
//void Info::release() mem_type == DEVICE_MEM_UHP ||
//{ mem_type == DEVICE_MEM_CHP )
// if(oclplatform) return -1;
// { gDeviceMemRW = rw_type;
// oclplatform = 0; gDeviceMemType = mem_type;
// } return 0;
// if(oclcontext) }
// {
// openCLSafeCall(clReleaseContext(oclcontext)); struct Info::Impl
// }
// devices.empty();
// devName.empty();
//}
struct Info::Impl
{ {
cl_platform_id oclplatform; cl_platform_id oclplatform;
std::vector<cl_device_id> devices; std::vector<cl_device_id> devices;
...@@ -290,11 +294,8 @@ namespace cv ...@@ -290,11 +294,8 @@ namespace cv
} }
void *getoclContext() void *getoclContext()
{ {
return &(Context::getContext()->impl->clContext); return &(Context::getContext()->impl->clContext);
} }
void *getoclCommandQueue() void *getoclCommandQueue()
...@@ -319,10 +320,16 @@ namespace cv ...@@ -319,10 +320,16 @@ namespace cv
void openCLMallocPitch(Context *clCxt, void **dev_ptr, size_t *pitch, void openCLMallocPitch(Context *clCxt, void **dev_ptr, size_t *pitch,
size_t widthInBytes, size_t height) size_t widthInBytes, size_t height)
{
openCLMallocPitchEx(clCxt, dev_ptr, pitch, widthInBytes, height, gDeviceMemRW, gDeviceMemType);
}
void openCLMallocPitchEx(Context *clCxt, void **dev_ptr, size_t *pitch,
size_t widthInBytes, size_t height, DevMemRW rw_type, DevMemType mem_type)
{ {
cl_int status; cl_int status;
*dev_ptr = clCreateBuffer(clCxt->impl->clContext, CL_MEM_READ_WRITE, *dev_ptr = clCreateBuffer(clCxt->impl->clContext, gDevMemRWValueMap[rw_type]|gDevMemTypeValueMap[mem_type],
widthInBytes * height, 0, &status); widthInBytes * height, 0, &status);
openCLVerifyCall(status); openCLVerifyCall(status);
*pitch = widthInBytes; *pitch = widthInBytes;
...@@ -837,6 +844,11 @@ namespace cv ...@@ -837,6 +844,11 @@ namespace cv
clcxt->impl->double_support = oclinfo.impl->double_support; clcxt->impl->double_support = oclinfo.impl->double_support;
//extra options to recognize compiler options //extra options to recognize compiler options
memcpy(clcxt->impl->extra_options, oclinfo.impl->extra_options, 512); memcpy(clcxt->impl->extra_options, oclinfo.impl->extra_options, 512);
cl_bool unfymem = false;
openCLSafeCall(clGetDeviceInfo(clcxt->impl->devices, CL_DEVICE_HOST_UNIFIED_MEMORY,
sizeof(cl_bool), (void *)&unfymem, NULL));
if(unfymem)
clcxt->impl->unified_memory = 1;
} }
Context::Context() Context::Context()
{ {
...@@ -853,6 +865,7 @@ namespace cv ...@@ -853,6 +865,7 @@ namespace cv
impl->double_support = 0; impl->double_support = 0;
//extra options to recognize vendor specific fp64 extensions //extra options to recognize vendor specific fp64 extensions
memset(impl->extra_options, 0, 512); memset(impl->extra_options, 0, 512);
impl->unified_memory = 0;
programCache = ProgramCache::getProgramCache(); programCache = ProgramCache::getProgramCache();
} }
......
...@@ -69,6 +69,8 @@ namespace cv ...@@ -69,6 +69,8 @@ namespace cv
extern const char *operator_setTo; extern const char *operator_setTo;
extern const char *operator_setToM; extern const char *operator_setToM;
extern const char *convertC3C4; extern const char *convertC3C4;
extern DevMemType gDeviceMemType;
extern DevMemRW gDeviceMemRW;
} }
} }
...@@ -912,7 +914,17 @@ oclMat cv::ocl::oclMat::reshape(int new_cn, int new_rows) const ...@@ -912,7 +914,17 @@ oclMat cv::ocl::oclMat::reshape(int new_cn, int new_rows) const
} }
void cv::ocl::oclMat::createEx(Size size, int type, DevMemRW rw_type, DevMemType mem_type)
{
createEx(size.height, size.width, type, rw_type, mem_type);
}
void cv::ocl::oclMat::create(int _rows, int _cols, int _type) void cv::ocl::oclMat::create(int _rows, int _cols, int _type)
{
createEx(_rows, _cols, _type, gDeviceMemRW, gDeviceMemType);
}
void cv::ocl::oclMat::createEx(int _rows, int _cols, int _type, DevMemRW rw_type, DevMemType mem_type)
{ {
clCxt = Context::getContext(); clCxt = Context::getContext();
/* core logic */ /* core logic */
...@@ -937,7 +949,7 @@ void cv::ocl::oclMat::create(int _rows, int _cols, int _type) ...@@ -937,7 +949,7 @@ void cv::ocl::oclMat::create(int _rows, int _cols, int _type)
size_t esz = elemSize(); size_t esz = elemSize();
void *dev_ptr; void *dev_ptr;
openCLMallocPitch(clCxt, &dev_ptr, &step, GPU_MATRIX_MALLOC_STEP(esz * cols), rows); openCLMallocPitchEx(clCxt, &dev_ptr, &step, GPU_MATRIX_MALLOC_STEP(esz * cols), rows, rw_type, mem_type);
//openCLMallocPitch(clCxt,&dev_ptr, &step, esz * cols, rows); //openCLMallocPitch(clCxt,&dev_ptr, &step, esz * cols, rows);
if (esz * cols == step) if (esz * cols == step)
......
...@@ -95,6 +95,8 @@ namespace cv ...@@ -95,6 +95,8 @@ namespace cv
///////////////////////////OpenCL call wrappers//////////////////////////// ///////////////////////////OpenCL call wrappers////////////////////////////
void openCLMallocPitch(Context *clCxt, void **dev_ptr, size_t *pitch, void openCLMallocPitch(Context *clCxt, void **dev_ptr, size_t *pitch,
size_t widthInBytes, size_t height); size_t widthInBytes, size_t height);
void openCLMallocPitchEx(Context *clCxt, void **dev_ptr, size_t *pitch,
size_t widthInBytes, size_t height, DevMemRW rw_type, DevMemType mem_type);
void openCLMemcpy2D(Context *clCxt, void *dst, size_t dpitch, void openCLMemcpy2D(Context *clCxt, void *dst, size_t dpitch,
const void *src, size_t spitch, const void *src, size_t spitch,
size_t width, size_t height, enum openCLMemcpyKind kind, int channels = -1); size_t width, size_t height, enum openCLMemcpyKind kind, int channels = -1);
...@@ -143,6 +145,7 @@ namespace cv ...@@ -143,6 +145,7 @@ namespace cv
//extra options to recognize vendor specific fp64 extensions //extra options to recognize vendor specific fp64 extensions
char extra_options[512]; char extra_options[512];
string Binpath; string Binpath;
int unified_memory; //1 means integrated GPU, otherwise this value is 0
}; };
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment