#include #include #include #include #include #define SIZE 4 #define NUM_WORK_GROUPS 2 #define KERNEL_NAME "vecadd" #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; \ decltype(_expr) _ret = _expr; \ if (_err != CL_SUCCESS) { \ printf("OpenCL Error: '%s' returned %d!\n", #_expr, (int)_err); \ cleanup(); \ exit(-1); \ } \ _ret; \ }) /*#include #ifdef __cplusplus extern "C" { #endif int _pocl_register_kernel(const char* name, const void* pfn, uint32_t num_args, uint32_t num_locals, const uint8_t* arg_types, const uint32_t* local_sizes); void _pocl_kernel_vecadd_workgroup(uint8_t* args, uint8_t*, uint32_t, uint32_t, uint32_t); #ifdef __cplusplus } #endif namespace { class auto_register_kernel_t { public: auto_register_kernel_t() { static uint8_t arg_types[] = {1, 1, 1}; static uint32_t local_sizes[] = {}; _pocl_register_kernel("vecadd", (void*)_pocl_kernel_vecadd_workgroup, 3, 0, arg_types, local_sizes); } }; static auto_register_kernel_t __x__; }*/ 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; uint8_t *kernel_bin = NULL; static int read_kernel_file(const char* filename, uint8_t** data, size_t* size) { if (nullptr == filename || nullptr == data || 0 == size) return -1; FILE* fp = fopen(filename, "r"); if (NULL == fp) { fprintf(stderr, "Failed to load kernel."); return -1; } fseek(fp , 0 , SEEK_END); long fsize = ftell(fp); rewind(fp); *data = (uint8_t*)malloc(fsize); *size = fread(*data, 1, fsize, fp); fclose(fp); return 0; } static 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 (kernel_bin) free(kernel_bin); if (A) free(A); if (B) free(B); if (C) free(C); } static int find_device(char* name, cl_platform_id platform_id, cl_device_id *device_id) { cl_device_id device_ids[64]; cl_uint num_devices = 0; CL_CHECK(clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_ALL, 64, device_ids, &num_devices)); for (int i=0; i