opencl
hello world
#include <stdio.h>
#include <stdlib.h>
#include <CL/cl.h>
// The kernel code
const char *kernelSource = "__kernel void add(__global int *input, __global int *output, const unsigned int count)\n"\
"{"\
" int id = get_global_id(0);\n"
" if(id < count)\n"
" output[id] = input[id] + input[id+1];\n"
"}";
int main()
{
// Create variables
cl_int error = 0;
const int count = 512;
size_t datasize = sizeof(int) * count;
int input[count], output[count];
size_t global[1] = { count - 1 };
// Initialize input data
for(int i = 0; i < count; i++) {
input[i] = i;
}
// Get platform and device information
cl_platform_id platform_id = 0;
cl_device_id device_id = 0;
error = clGetPlatformIDs(1, &platform_id, NULL);
error = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL);
// Create OpenCL context
cl_context context = clCreateContext(0, 1, &device_id, NULL, NULL, &error);
// Create command queue
cl_command_queue command_queue = clCreateCommandQueue(context, device_id, 0, &error);
// Create memory buffers
cl_mem input_buffer = clCreateBuffer(context, CL_MEM_READ_ONLY, datasize, NULL, &error);
cl_mem output_buffer = clCreateBuffer(context, CL_MEM_WRITE_ONLY, datasize, NULL, &error);
// Copy input data to buffer
error = clEnqueueWriteBuffer(command_queue, input_buffer, CL_TRUE, 0, datasize, input, 0, NULL, NULL);
// Create program from kernel source
cl_program program = clCreateProgramWithSource(context, 1, (const char**) &kernelSource, NULL, &error);
// Build program
error = clBuildProgram(program, 0, NULL, NULL, NULL, NULL);
// Create kernel
cl_kernel kernel = clCreateKernel(program, "add", &error);
// Set arguments to kernel
error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &input_buffer);
error = clSetKernelArg(kernel, 1, sizeof(cl_mem), &output_buffer);
error = clSetKernelArg(kernel, 2, sizeof(unsigned int), &count);
// Execute kernel
error = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, global, NULL, 0, NULL, NULL);
// Read output buffer
error = clEnqueueReadBuffer(command_queue, output_buffer, CL_TRUE, 0, datasize, output, 0, NULL, NULL);
// Display results
for(int i = 0; i < count; i++) {
printf("%d ", output[i]);
}
// Cleanup
error = clFlush(command_queue);
error = clFinish(command_queue);
error = clReleaseKernel(kernel);
error = clReleaseProgram(program);
error = clReleaseMemObject(input_buffer);
error = clReleaseMemObject(output_buffer);
error = clReleaseCommandQueue(command_queue);
error = clReleaseContext(context);
return 0;
}
cl_int: A data type used by OpenCL to represent error codes.cl_platform_id and cl_device_id: Unique identifiers for OpenCL platforms and devices, respectively.cl_context: A container for OpenCL objects that represent a set of devices.cl_command_queue: A queue of commands to be executed on a device.cl_mem: A handle to a memory object on a device.cl_program: A collection of kernels that can be compiled and built for execution on a device.cl_kernel: A function that runs on a device as part of an OpenCL program.clSetKernelArg: A function that sets the arguments to an OpenCL kernel.clEnqueueNDRangeKernel: A function that schedules a kernel for execution on a device.clEnqueueReadBuffer: A function that reads the contents of a memory buffer on a device.
附件: OpenCL异构计算.pdf