Hi all,
this is my code:
// Initialize OpenCL
cl_int error;
cl::vector< cl::Platform > platformList;
cl::Platform::get(&platformList);
checkErr(platformList.size()!=0 ? CL_SUCCESS : -1, "cl::Platform::get");
std::cout << "Platform number is: " << platformList.size() << std::endl;
std::string platformVendor;
platformList[0].getInfo((cl_platform_info)CL_PLATFORM_VENDOR, &platformVendor);
std::cout << "Platform is by: " << platformVendor << "\n";
cl_context_properties cprops[3] = {CL_CONTEXT_PLATFORM, (cl_context_properties)(platformList[0])(), 0};
cl::Context context(CL_DEVICE_TYPE_GPU/*CL_DEVICE_TYPE_CPU*/, cprops, NULL, NULL, &error);
checkErr(error, "Conext::Context()");
/** Allocate image buffer **/
cl_uchar image2[int(m*n)];
int h = 0;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
{
image2[h] = (cl_uchar)image[i][j];
h++;
}
cl::Buffer imageCL( context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, m*n*sizeof(cl_uchar), image2, &error);
checkErr(error, "Buffer::outCL(image)");
/*****/
// get OpenCL devices
cl::vector<cl::Device> devices;
devices = context.getInfo<CL_CONTEXT_DEVICES>();
checkErr(devices.size() > 0 ? CL_SUCCESS : -1, "devices.size() > 0");
// read OpenCL C file
#ifdef __APPLE__
std::ifstream file("../../mandelbrot.cl");
#else
std::ifstream file("mandelbrot.cl");
#endif
std::ios_base::iostate state = file.rdstate();
state;
checkErr(file.is_open() ? CL_SUCCESS:-1, "read mandelbrot.cl");
// save file to string
std::string prog(std::istreambuf_iterator<char>(file), (std::istreambuf_iterator<char>()));
// make OpenCL C file to OpenCL source
cl::Program::Sources source(1, std::make_pair(prog.c_str(), prog.length()+1));
// build OpenCL source
cl::Program program(context, source);
error = program.build(devices,"");
checkErr(error, "cl::Program program.build()");
// define entry point
cl::Kernel kernel(program, "mandelCalcCL", &error);
checkErr(error, "Kernel::Kernel()");
// set arguments
error = kernel.setArg(0, max);//maxCL);
checkErr(error, "Kernel::setArg(max)");
error = kernel.setArg(1, m);//mCL);
checkErr(error, "Kernel::setArg(m)");
error = kernel.setArg(2, n);//nCL);
checkErr(error, "Kernel::setArg(n)");
error = kernel.setArg(3, cx);//cxCL);
checkErr(error, "Kernel::setArg(cx)");
error = kernel.setArg(4, cy);//cyCL);
checkErr(error, "Kernel::setArg(cy)");
error = kernel.setArg(5, width);//widthCL);
checkErr(error, "Kernel::setArg(width)");
error = kernel.setArg(6, height);//heightCL);
checkErr(error, "Kernel::setArg(height)");
error = kernel.setArg(7, imageCL);
checkErr(error, "Kernel::setArg(image)");
// initialize queue
cl::CommandQueue queue(context, devices[0], 0, &error);
checkErr(error, "CommandQueue::CommandQueue()");
error = queue.enqueueWriteBuffer(imageCL, true, (::size_t)0, (::size_t)(m*n*sizeof(cl_uchar)), (void*)&image2, NULL, NULL);
checkErr(error, "cl::CommandQueue::enqueueWriteBuffer()");
// create event
cl::Event event;
error = queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(1/*N*M*sizeof(cl_uchar)*/), cl::NDRange(1/*, 1*/), NULL, &event);
checkErr(error, "ComamndQueue::enqueueNDRangeKernel()");
// wait until computation is finished
error = event.wait();
checkErr(error, "event.wait()");
// read image buffer
error = queue.enqueueReadBuffer(imageCL, CL_TRUE, 0, n*m/**sizeof(cl_uchar)*/, &image2);
//error = queue.enqueueWriteBuffer(imageCL, CL_TRUE, 0, n*m*sizeof(cl_uchar), &image2);
checkErr(error, "ComamndQueue::enqueueReadBuffer(image)");
h = 0;
std::ofstream myfile("CL.txt");
for(int i = 0; i < M; i++)
for(int j = 0; j < N; j++)
{
myfile << " " << toString(image2[h]) << " ";
if((h != 0) && (h%20 == 0))
myfile << "\n";
else
myfile << "-";
image[i][j] = image2[h];
h++;
}
myfile.close();
enqueueReadBuffer does not return any result!
I know that the algorithm works, because in C++ is everything ok.
Please help me to understand why it doesn’t work.
Have I to call anything in my OpenCL code to transfer the data to the buffer?
Greets
Henrik