/*
* PrepareOpenCL.cpp
*
* Created on: 2017年8月10日
* Author: root
*/
#include "PrepareOpenCL.hpp"
prepareing::prepareing():rgbarray(new uchar[256*256*256]),rgbsize(256*256*256),
imgheight(1456),imgwidth(1936),mysize(cvSize(1936,1456)),
srcdatasize(1456*1936*3*sizeof(uchar)),dstdatasize(1456*1936*sizeof(uchar)),
rgbArray_buffer(NULL),kernel_imgProc(NULL),device(NULL),
context(NULL),program(NULL)
{
memset(rgbarray, 0, rgbsize * sizeof(uchar));
Ptr<ml::TrainData> mlData2=cv::ml::TrainData::loadFromCSV("/home/jumper/Ore_projects/multiThreadsFluoreOpenCL/fluore_0728pm.csv",0,-2,0);
cv::Mat csvimg2=mlData2->getSamples();
int csvrows2 = csvimg2.rows;
for (int j = 0; j < csvrows2; j++){
float* pixeldata = csvimg2.ptr<float>(j);
float x = pixeldata[0];
float y = pixeldata[1];
float z = pixeldata[2];
int newindex = x + y * 256 + z * 256 * 256;
rgbarray[newindex] = 255;
}
//"prepare for running the OpenCL partion...";
cl_uint platformNum;
cl_int status;
status=clGetPlatformIDs(0,NULL,&platformNum);
if(status!=CL_SUCCESS){
printf("Error:cannot get platforms number.\n");
}
cl_platform_id platforms[1];
status=clGetPlatformIDs(platformNum,platforms,NULL);
if(status!=CL_SUCCESS){
printf("Error:cannot get platforms addresses.\n");
}
cl_platform_id platformInUse=platforms[0];
clGetDeviceIDs(platformInUse,CL_DEVICE_TYPE_GPU,1,&device,NULL);
context=clCreateContext(NULL,1,&device,NULL,NULL,NULL);
std::ifstream srcFile("/home/jumper/Ore_projects/multiThreadsFluoreOpenCL/forFluore.cl");
std::string srcProg(std::istreambuf_iterator<char>(srcFile),(std::istreambuf_iterator<char>()));
const char * src = srcProg.c_str();
size_t length = srcProg.length();
program=clCreateProgramWithSource(context,1,&src,&length,&status);
status=clBuildProgram(program,1,&device,NULL,NULL,NULL);
if (status != CL_SUCCESS)
{
printf("Error:clBuildProgram()...\n");
shrLogEx(LOGBOTH | ERRORMSG, status, STDERROR);
oclLogBuildInfo(program, oclGetFirstDev(context));
oclLogPtx(program, oclGetFirstDev(context), "oclfluore.ptx");
}
rgbArray_buffer=clCreateBuffer(context,CL_MEM_READ_ONLY,rgbsize*sizeof(uchar),rgbarray,&status);
//cout<<"srcdatasize in PrepareOpenCL..."<<srcdatasize<<endl;
for(int i=0;i<threadsnum;i++) //number of threads
{
queue[i]=clCreateCommandQueue(context,device,CL_QUEUE_PROFILING_ENABLE,NULL);
status=clEnqueueWriteBuffer(queue[i], rgbArray_buffer, CL_FALSE, 0, rgbsize* sizeof(uchar),rgbarray, 0, NULL, NULL);
srcdata_buffer[i] = clCreateBuffer(context, CL_MEM_READ_ONLY, srcdatasize, NULL,NULL);
dstdata_buffer[i] = clCreateBuffer(context, CL_MEM_WRITE_ONLY| CL_MEM_ALLOC_HOST_PTR, dstdatasize, NULL,NULL);
}
kernel_imgProc=clCreateKernel(program,"imgProcess",&status);
status = clSetKernelArg(kernel_imgProc, 0, sizeof(cl_mem), (void*)&rgbArray_buffer);
status = clSetKernelArg(kernel_imgProc, 3, sizeof(cl_int), &imgwidth);
status = clSetKernelArg(kernel_imgProc, 4, sizeof(cl_int), &imgheight);
if(status!=CL_SUCCESS)
{
cout<<"common resources failed..."<<status<<endl;
}
}
void prepareing::initCommonResource()
{
}
prepareing& prepareing::operator=(const prepareing &rhs)
{
imgwidth=rhs.imgwidth;
imgheight=rhs.imgheight;
mysize=rhs.mysize;
rgbsize=rhs.rgbsize;
device=rhs.device;
program=rhs.program;
context=rhs.context;
kernel_imgProc=rhs.kernel_imgProc;
rgbArray_buffer=rhs.rgbArray_buffer;
srcdatasize=rhs.srcdatasize;
dstdatasize=rhs.dstdatasize;
if(rgbarray==NULL)
rgbarray=new uchar[rgbsize];
for(int j=0;j<rgbsize;j++)
rgbarray[j]=rhs.rgbarray[j];
for(int i=0;i<threadsnum;i++)
{
queue[i]=rhs.queue[i];
srcdata_buffer[i]=rhs.srcdata_buffer[i];
dstdata_buffer[i]=rhs.dstdata_buffer[i];
}
return *this;
}
prepareing::~prepareing()
{
if(rgbarray)
delete [] rgbarray;
clReleaseContext(context);
clReleaseProgram(program);
clReleaseKernel(kernel_imgProc);
for(int i=0;i<threadsnum;i++)
{
clReleaseCommandQueue(queue[i]);
clReleaseMemObject(dstdata_buffer[i]);
clReleaseMemObject(srcdata_buffer[i]);
}
clReleaseMemObject(rgbArray_buffer);
}
host多线程下OpenCL平台等单例(最终版本)
3星 · 超过75%的资源 需积分: 9 30 浏览量
2017-08-16
11:12:13
上传
评论 1
收藏 4KB GZ 举报
元气少女缘结神
- 粉丝: 6065
- 资源: 65
最新资源
- apk.tw_LineLite_v8a_v.2.17.1_sign.apk
- Elasticsearch实战:构建高效搜索系统的秘诀.zip
- HTML+CSS+JS网页设计:从入门到精通.zip
- 数据库课程设计:从理论到实践的全面指南.zip
- Python闭包:深入理解与应用场景解析.zip
- Win64OpenSSL-3-3-0.exe
- 课高分程设计-基于C++实现的民航飞行与地图简易管理系统-南京航空航天大学
- 航天器遥测数据故障检测系统python源码+文档说明+数据库(课程设计)
- 北京航空航天大学操作系统课设+ppt+实验报告
- 基于Vue+Echarts实现风力发电机中传感器的数据展示监控可视化系统+源代码+文档说明(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈