34 string filename =
"assets/input.bmp";
36 cl_context context = 0;
37 cl_command_queue commandQueue = 0;
38 cl_program program = 0;
39 cl_device_id device = 0;
41 const int numberOfMemoryObjects = 3;
43 const unsigned int imagePixelsIndex = 0;
44 const unsigned int squareIndex = 1;
45 const unsigned int sumIndex = 2;
46 cl_mem memoryObjects[3] = {0, 0, 0};
52 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
53 cerr <<
"Failed to create an OpenCL context. " << __FILE__ <<
":"<< __LINE__ << endl;
59 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
60 cerr <<
"Failed to create the OpenCL command queue. " << __FILE__ <<
":"<< __LINE__ << endl;
67 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
68 cerr <<
"cl_khr_int64_base_atomics is not supported on this device. " << __FILE__ <<
":"<< __LINE__ << endl;
72 if (!
createProgram(context, device,
"assets/64_bit_integer.cl", &program))
74 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
75 cerr <<
"Failed to create OpenCL program." << __FILE__ <<
":"<< __LINE__ << endl;
79 kernel = clCreateKernel(program,
"long_vectors", &errorNumber);
82 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
83 cerr <<
"Failed to create OpenCL kernel. " << __FILE__ <<
":"<< __LINE__ << endl;
90 unsigned char* loadedRGBData = NULL;
93 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
94 cerr <<
"Failed loading bitmap. " << __FILE__ <<
":"<< __LINE__ << endl;
99 size_t bufferSizeChar = width * height *
sizeof(
unsigned char);
101 size_t bufferSizeLong =
sizeof(cl_ulong);
109 bool createMemoryObjectsSuccess =
true;
111 memoryObjects[imagePixelsIndex] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, bufferSizeChar, NULL, &errorNumber);
112 createMemoryObjectsSuccess &=
checkSuccess(errorNumber);
114 memoryObjects[squareIndex] = clCreateBuffer(context, CL_MEM_READ_WRITE| CL_MEM_ALLOC_HOST_PTR, bufferSizeLong, NULL, &errorNumber);
115 createMemoryObjectsSuccess &=
checkSuccess(errorNumber);
117 memoryObjects[sumIndex] = clCreateBuffer(context, CL_MEM_READ_WRITE| CL_MEM_ALLOC_HOST_PTR, bufferSizeLong, NULL, &errorNumber);
118 createMemoryObjectsSuccess &=
checkSuccess(errorNumber);
120 if (!createMemoryObjectsSuccess)
122 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
123 cerr <<
"Failed to create OpenCL buffer. " << __FILE__ <<
":"<< __LINE__ << endl;
128 bool mapMemoryObjectsSuccess =
true;
129 cl_uchar* inputImagePixels = (cl_uchar*)clEnqueueMapBuffer(commandQueue, memoryObjects[imagePixelsIndex], CL_TRUE, CL_MAP_WRITE, 0, bufferSizeChar, 0, NULL, NULL, &errorNumber);
131 cl_ulong* inputSquareOfPixels = (cl_ulong*)clEnqueueMapBuffer(commandQueue, memoryObjects[squareIndex], CL_TRUE, CL_MAP_WRITE, 0, bufferSizeLong, 0, NULL, NULL, &errorNumber);
133 cl_ulong* inputSumOfPixels = (cl_ulong*)clEnqueueMapBuffer(commandQueue, memoryObjects[sumIndex], CL_TRUE, CL_MAP_WRITE, 0, bufferSizeLong, 0, NULL, NULL, &errorNumber);
136 if (!mapMemoryObjectsSuccess)
138 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
139 cerr <<
"Mapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
148 delete [] loadedRGBData;
151 *inputSquareOfPixels = 0;
152 *inputSumOfPixels = 0;
155 bool unmapMemoryObjectsSuccess =
true;
156 unmapMemoryObjectsSuccess &=
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[imagePixelsIndex], inputImagePixels, 0, NULL, NULL));
157 unmapMemoryObjectsSuccess &=
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[squareIndex], inputSquareOfPixels, 0, NULL, NULL));
158 unmapMemoryObjectsSuccess &=
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[sumIndex], inputSumOfPixels, 0, NULL, NULL));
160 if (!unmapMemoryObjectsSuccess)
162 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
163 cerr <<
"Unmapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
168 bool setKernelArgumentsSuccess =
true;
169 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, imagePixelsIndex,
sizeof(cl_mem), &memoryObjects[imagePixelsIndex]));
170 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, squareIndex,
sizeof(cl_mem), &memoryObjects[squareIndex]));
171 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, sumIndex,
sizeof(cl_mem), &memoryObjects[sumIndex]));
173 if (!setKernelArgumentsSuccess)
175 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
176 cerr <<
"Failed setting OpenCL kernel arguments. " << __FILE__ <<
":"<< __LINE__ << endl;
187 size_t globalWorksize[1] = {(width * height) / 8};
190 if (!
checkSuccess(clEnqueueNDRangeKernel(commandQueue, kernel, work_dim, NULL, globalWorksize, NULL, 0, NULL, &event)))
192 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
193 cerr <<
"Failed enqueuing the kernel. " << __FILE__ <<
":"<< __LINE__ << endl;
200 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
201 cerr <<
"Failed waiting for kernel execution to finish. " << __FILE__ <<
":"<< __LINE__ << endl;
210 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
211 cerr <<
"Failed releasing the event object. " << __FILE__ <<
":"<< __LINE__ << endl;
216 mapMemoryObjectsSuccess =
true;
217 cl_ulong* squareOfPixels = (cl_ulong*)clEnqueueMapBuffer(commandQueue, memoryObjects[squareIndex], CL_TRUE, CL_MAP_READ, 0, bufferSizeLong, 0, NULL, NULL, &errorNumber);
220 cl_ulong* sumOfPixels = (cl_ulong*)clEnqueueMapBuffer(commandQueue, memoryObjects[sumIndex], CL_TRUE, CL_MAP_READ, 0, bufferSizeLong, 0, NULL, NULL, &errorNumber);
222 if (!mapMemoryObjectsSuccess)
224 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
225 cerr <<
"Failed to map buffer. " << __FILE__ <<
":"<< __LINE__ << endl;
230 cout <<
"Square of the pixel values = " << *squareOfPixels <<
"\n";
231 cout <<
"Sum of the pixel values = " << *sumOfPixels << endl;
235 unmapMemoryObjectsSuccess =
true;
236 unmapMemoryObjectsSuccess &=
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[squareIndex], squareOfPixels, 0, NULL, NULL));
237 unmapMemoryObjectsSuccess &=
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[sumIndex], sumOfPixels, 0, NULL, NULL));
239 if (!unmapMemoryObjectsSuccess)
241 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
242 cerr <<
"Unmapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
247 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);