#include #include #include #include #define MAX_KERNELS 1 #define KERNEL_NAME "vecadd" #define KERNEL_FILE_NAME "vecadd.pocl" #define SIZE 64 #define NUM_WORK_GROUPS 16 #define CL_CHECK(_expr) \ do { \ cl_int _err = _expr; \ if (_err == CL_SUCCESS) \ break; \ printf("OpenCL Error: '%s' returned %d!\n", #_expr, (int)_err); \ cleanup(); \ exit(-1); \ } while (0) #define CL_CHECK2(_expr) \ ({ \ cl_int _err = CL_INVALID_VALUE; \ typeof(_expr) _ret = _expr; \ if (_err != CL_SUCCESS) { \ printf("OpenCL Error: '%s' returned %d!\n", #_expr, (int)_err); \ cleanup(); \ exit(-1); \ } \ _ret; \ }) int exitcode = 0; cl_context context = NULL; cl_command_queue commandQueue = NULL; cl_program program = NULL; cl_kernel kernel = NULL; cl_mem a_memobj = NULL; cl_mem b_memobj = NULL; cl_mem c_memobj = NULL; cl_int *A = NULL; cl_int *B = NULL; cl_int *C = NULL; char *binary = NULL; void cleanup() { if (commandQueue) clReleaseCommandQueue(commandQueue); if (kernel) clReleaseKernel(kernel); if (program) clReleaseProgram(program); if (a_memobj) clReleaseMemObject(a_memobj); if (b_memobj) clReleaseMemObject(b_memobj); if (c_memobj) clReleaseMemObject(c_memobj); if (context) clReleaseContext(context); if (binary) free(binary); if (A) free(A); if (B) free(B); if (C) free(C); } int main (int argc, char **argv) { cl_platform_id platform_id; cl_device_id device_id; size_t binary_size; int i; // Getting platform and device information CL_CHECK(clGetPlatformIDs(1, &platform_id, NULL)); CL_CHECK(clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, NULL)); // Creating context. context = CL_CHECK2(clCreateContext(NULL, 1, &device_id, NULL, NULL, &_err)); // Memory buffers for each array a_memobj = CL_CHECK2(clCreateBuffer(context, CL_MEM_READ_ONLY, SIZE * sizeof(cl_int), NULL, &_err)); b_memobj = CL_CHECK2(clCreateBuffer(context, CL_MEM_READ_ONLY, SIZE * sizeof(cl_int), NULL, &_err)); c_memobj = CL_CHECK2(clCreateBuffer(context, CL_MEM_WRITE_ONLY, SIZE * sizeof(cl_int), NULL, &_err)); // Allocate memories for input arrays and output arrays. A = (cl_int*)malloc(sizeof(cl_int)*SIZE); B = (cl_int*)malloc(sizeof(cl_int)*SIZE); C = (cl_int*)malloc(sizeof(cl_int)*SIZE); // Initialize values for array members. for (i=0; i