enqueueReadBuffer does not return any result

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

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

Hi all,

I figured out that my problem is the openCL code.
He does return a result but my kernel does not calculate the right.

Greets
Henrik

Hi all,

I figured out that my problem is the openCL code.
He does return a result but my kernel does not calculate the right.

Greets
Henrik