27 cl_context context = 0;
28 cl_command_queue commandQueue = 0;
29 cl_program program = 0;
30 cl_device_id device = 0;
32 int numberOfMemoryObjects = 3;
33 cl_mem memoryObjects[3] = {0, 0, 0};
38 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
39 cerr <<
"Failed to create an OpenCL context. " << __FILE__ <<
":"<< __LINE__ << endl;
45 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
46 cerr <<
"Failed to create the OpenCL command queue. " << __FILE__ <<
":"<< __LINE__ << endl;
50 if (!
createProgram(context, device,
"assets/hello_world_opencl.cl", &program))
52 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
53 cerr <<
"Failed to create OpenCL program." << __FILE__ <<
":"<< __LINE__ << endl;
57 kernel = clCreateKernel(program,
"hello_world_opencl", &errorNumber);
60 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
61 cerr <<
"Failed to create OpenCL kernel. " << __FILE__ <<
":"<< __LINE__ << endl;
67 cl_int arraySize = 1000000;
70 size_t bufferSize = arraySize *
sizeof(cl_int);
78 bool createMemoryObjectsSuccess =
true;
80 memoryObjects[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, bufferSize, NULL, &errorNumber);
83 memoryObjects[1] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, bufferSize, NULL, &errorNumber);
86 memoryObjects[2] = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, bufferSize, NULL, &errorNumber);
89 if (!createMemoryObjectsSuccess)
91 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
92 cerr <<
"Failed to create OpenCL buffer. " << __FILE__ <<
":"<< __LINE__ << endl;
99 bool mapMemoryObjectsSuccess =
true;
101 cl_int* inputA = (cl_int*)clEnqueueMapBuffer(commandQueue, memoryObjects[0], CL_TRUE, CL_MAP_WRITE, 0, bufferSize, 0, NULL, NULL, &errorNumber);
104 cl_int* inputB = (cl_int*)clEnqueueMapBuffer(commandQueue, memoryObjects[1], CL_TRUE, CL_MAP_WRITE, 0, bufferSize, 0, NULL, NULL, &errorNumber);
107 if (!mapMemoryObjectsSuccess)
109 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
110 cerr <<
"Failed to map buffer. " << __FILE__ <<
":"<< __LINE__ << endl;
116 for (
int i = 0; i < arraySize; i++)
130 if (!
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[0], inputA, 0, NULL, NULL)))
132 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
133 cerr <<
"Unmapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
137 if (!
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[1], inputB, 0, NULL, NULL)))
139 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
140 cerr <<
"Unmapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
146 bool setKernelArgumentsSuccess =
true;
147 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 0,
sizeof(cl_mem), &memoryObjects[0]));
148 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 1,
sizeof(cl_mem), &memoryObjects[1]));
149 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 2,
sizeof(cl_mem), &memoryObjects[2]));
151 if (!setKernelArgumentsSuccess)
153 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
154 cerr <<
"Failed setting OpenCL kernel arguments. " << __FILE__ <<
":"<< __LINE__ << endl;
167 size_t globalWorksize[1] = {arraySize};
169 if (!
checkSuccess(clEnqueueNDRangeKernel(commandQueue, kernel, 1, NULL, globalWorksize, NULL, 0, NULL, &event)))
171 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
172 cerr <<
"Failed enqueuing the kernel. " << __FILE__ <<
":"<< __LINE__ << endl;
180 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
181 cerr <<
"Failed waiting for kernel execution to finish. " << __FILE__ <<
":"<< __LINE__ << endl;
190 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
191 cerr <<
"Failed releasing the event object. " << __FILE__ <<
":"<< __LINE__ << endl;
196 cl_int* output = (cl_int*)clEnqueueMapBuffer(commandQueue, memoryObjects[2], CL_TRUE, CL_MAP_READ, 0, bufferSize, 0, NULL, NULL, &errorNumber);
199 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
200 cerr <<
"Failed to map buffer. " << __FILE__ <<
":"<< __LINE__ << endl;
215 if (!
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[2], output, 0, NULL, NULL)))
217 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
218 cerr <<
"Unmapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
223 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);