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

标签: opencl

添加新评论