char* load_source_file(const char* file_name){ char* source = NULL; FILE* f; struct stat statbuf; f = fopen(file_name, "rb"); if (!f){ printf("OpenCL kernel file \"%s\" not found!", file_name); ocl_clean_up(); exit(1); } stat(file_name, &statbuf); source = (char*)malloc(statbuf.st_size + 1); fread(source, statbuf.st_size + 1, 1, f); source[statbuf.st_size] = '\0'; return source; }
// Main function // ********************************************************************* int main(int argc, char **argv) { if (!device_comm_queue) ocl_initialize(); const char* program_source; program_source = load_source_file(argv[1]); cl_program ocl_program = clCreateProgramWithSource(device_context, 1, (const char**)&program_source, NULL, NULL); printf("********** program created.\n"); // Build the program (OpenCL JIT compilation) char options[100]; const char* flags = "-g -w -I\""; const char* OMHOME = getenv("OPENMODELICAHOME"); const char* OMINCL = "/include/omc\""; const char* OMBIN = "/bin\""; if ( OMHOME != NULL ) { strcpy(options, flags); strcat(options, OMHOME); strcat(options, OMINCL); strcat(options, " -I\""); strcat(options, OMHOME); strcat(options, OMBIN); printf("Building OpenCL code with flags %s\n",options); cl_int err; err = clBuildProgram(ocl_program, 0, NULL, options, NULL, NULL); ocl_error_check(OCL_BUILD_PROGRAM, err); size_t size; clGetProgramBuildInfo(ocl_program, ocl_device, CL_PROGRAM_BUILD_LOG, // Get build log size 0, NULL, &size); char * log = (char*)malloc(size); clGetProgramBuildInfo(ocl_program,ocl_device,CL_PROGRAM_BUILD_LOG,size,log, NULL); printf("\t\tCL_PROGRAM_BUILD_LOG: \t%s\n", log); free(log); if(err){ printf("Errors detected in compilation of OpenCL code:\n"); exit(1); } else printf("Program built successfuly.\n"); //if no error create the binary clGetProgramInfo(ocl_program, CL_PROGRAM_BINARY_SIZES, sizeof(size_t), &size, NULL); unsigned char * binary = (unsigned char*)malloc(size); printf("Size of program binary :\t%d\n",size); clGetProgramInfo(ocl_program, CL_PROGRAM_BINARIES, sizeof(size_t), &binary, NULL); printf("Program binary retrived.\n"); const char* binary_ext = ".bin"; char* binary_name = strcat(argv[1],binary_ext); printf("binary file name %s\n", binary_name); FILE * cache; cache = fopen(binary_name, "wb"); fwrite(binary, sizeof(char), size, cache); fclose(cache); //free(binary); err = 0; cl_program newprogram = clCreateProgramWithBinary(device_context, 1, &ocl_device, &size, (const unsigned char **)&binary, NULL, &err); if(!err) printf("Program created from binary\n"); else{ switch (err){ case CL_INVALID_CONTEXT: printf("Error building program:\n"); printf("CL_INVALID_CONTEXT \n"); break; case CL_INVALID_VALUE: printf("Error building program:\n"); printf("CL_INVALID_VALUE \n"); break; case CL_INVALID_DEVICE: printf("Error building program:\n"); printf("CL_INVALID_DEVICE \n"); break; case CL_INVALID_BINARY: printf("Error building program:\n"); printf("CL_INVALID_BINARY \n"); break; case CL_OUT_OF_HOST_MEMORY: printf("Error building program:\n"); printf("CL_OUT_OF_HOST_MEMORY \n"); break; } } return 0; } else { printf("Couldn't find OPENMODELICAHOME!\n"); exit(1); } ocl_clean_up(); return 0; }