OpenCL_helper_library.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "OpenCL_helper_library.h"
  2. // Loads the kernel source code from the specified file into a C string and returns the string pointer
  3. char *load_kernel_source(const char *filename) {
  4. // Open the source file
  5. FILE *file = fopen(filename, "r");
  6. if (file == NULL) fatal("Error opening kernel source file\n");
  7. // Determine the size of the file
  8. if (fseek(file, 0, SEEK_END)) fatal("Error reading kernel source file\n");
  9. size_t size = ftell(file);
  10. // Allocate space for the source code (plus one for null-terminator)
  11. char *source = (char *) malloc(size + 1);
  12. // Read the source code into the string
  13. fseek(file, 0, SEEK_SET);
  14. // printf("Number of elements: %lu\nSize = %lu", fread(source, 1, size, file), size);
  15. // exit(1);
  16. if (fread(source, 1, size, file) != size) fatal("Error reading kernel source file\n");
  17. // Null-terminate the string
  18. source[size] = '\0';
  19. // Return the pointer to the string
  20. return source;
  21. }
  22. // Returns the current system time in microseconds
  23. long long get_time() {
  24. struct timeval tv;
  25. gettimeofday(&tv, NULL);
  26. return (tv.tv_sec * 1000000) + tv.tv_usec;
  27. }
  28. void fatal(const char *s) {
  29. fprintf(stderr, "Error: %s\n", s);
  30. exit(1);
  31. }
  32. // Prints a string version of the specified OpenCL error code
  33. void fatal_CL(cl_int error, int line_no) {
  34. printf("Error at line %d: ", line_no);
  35. // Print
  36. switch(error) {
  37. case CL_SUCCESS: printf("CL_SUCCESS\n"); break;
  38. case CL_DEVICE_NOT_FOUND: printf("CL_DEVICE_NOT_FOUND\n"); break;
  39. case CL_DEVICE_NOT_AVAILABLE: printf("CL_DEVICE_NOT_AVAILABLE\n"); break;
  40. case CL_COMPILER_NOT_AVAILABLE: printf("CL_COMPILER_NOT_AVAILABLE\n"); break;
  41. case CL_MEM_OBJECT_ALLOCATION_FAILURE: printf("CL_MEM_OBJECT_ALLOCATION_FAILURE\n"); break;
  42. case CL_OUT_OF_RESOURCES: printf("CL_OUT_OF_RESOURCES\n"); break;
  43. case CL_OUT_OF_HOST_MEMORY: printf("CL_OUT_OF_HOST_MEMORY\n"); break;
  44. case CL_PROFILING_INFO_NOT_AVAILABLE: printf("CL_PROFILING_INFO_NOT_AVAILABLE\n"); break;
  45. case CL_MEM_COPY_OVERLAP: printf("CL_MEM_COPY_OVERLAP\n"); break;
  46. case CL_IMAGE_FORMAT_MISMATCH: printf("CL_IMAGE_FORMAT_MISMATCH\n"); break;
  47. case CL_IMAGE_FORMAT_NOT_SUPPORTED: printf("CL_IMAGE_FORMAT_NOT_SUPPORTED\n"); break;
  48. case CL_BUILD_PROGRAM_FAILURE: printf("CL_BUILD_PROGRAM_FAILURE\n"); break;
  49. case CL_MAP_FAILURE: printf("CL_MAP_FAILURE\n"); break;
  50. case CL_INVALID_VALUE: printf("CL_INVALID_VALUE\n"); break;
  51. case CL_INVALID_DEVICE_TYPE: printf("CL_INVALID_DEVICE_TYPE\n"); break;
  52. case CL_INVALID_PLATFORM: printf("CL_INVALID_PLATFORM\n"); break;
  53. case CL_INVALID_DEVICE: printf("CL_INVALID_DEVICE\n"); break;
  54. case CL_INVALID_CONTEXT: printf("CL_INVALID_CONTEXT\n"); break;
  55. case CL_INVALID_QUEUE_PROPERTIES: printf("CL_INVALID_QUEUE_PROPERTIES\n"); break;
  56. case CL_INVALID_COMMAND_QUEUE: printf("CL_INVALID_COMMAND_QUEUE\n"); break;
  57. case CL_INVALID_HOST_PTR: printf("CL_INVALID_HOST_PTR\n"); break;
  58. case CL_INVALID_MEM_OBJECT: printf("CL_INVALID_MEM_OBJECT\n"); break;
  59. case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: printf("CL_INVALID_IMAGE_FORMAT_DESCRIPTOR\n"); break;
  60. case CL_INVALID_IMAGE_SIZE: printf("CL_INVALID_IMAGE_SIZE\n"); break;
  61. case CL_INVALID_SAMPLER: printf("CL_INVALID_SAMPLER\n"); break;
  62. case CL_INVALID_BINARY: printf("CL_INVALID_BINARY\n"); break;
  63. case CL_INVALID_BUILD_OPTIONS: printf("CL_INVALID_BUILD_OPTIONS\n"); break;
  64. case CL_INVALID_PROGRAM: printf("CL_INVALID_PROGRAM\n"); break;
  65. case CL_INVALID_PROGRAM_EXECUTABLE: printf("CL_INVALID_PROGRAM_EXECUTABLE\n"); break;
  66. case CL_INVALID_KERNEL_NAME: printf("CL_INVALID_KERNEL_NAME\n"); break;
  67. case CL_INVALID_KERNEL_DEFINITION: printf("CL_INVALID_KERNEL_DEFINITION\n"); break;
  68. case CL_INVALID_KERNEL: printf("CL_INVALID_KERNEL\n"); break;
  69. case CL_INVALID_ARG_INDEX: printf("CL_INVALID_ARG_INDEX\n"); break;
  70. case CL_INVALID_ARG_VALUE: printf("CL_INVALID_ARG_VALUE\n"); break;
  71. case CL_INVALID_ARG_SIZE: printf("CL_INVALID_ARG_SIZE\n"); break;
  72. case CL_INVALID_KERNEL_ARGS: printf("CL_INVALID_KERNEL_ARGS\n"); break;
  73. case CL_INVALID_WORK_DIMENSION: printf("CL_INVALID_WORK_DIMENSION\n"); break;
  74. case CL_INVALID_WORK_GROUP_SIZE: printf("CL_INVALID_WORK_GROUP_SIZE\n"); break;
  75. case CL_INVALID_WORK_ITEM_SIZE: printf("CL_INVALID_WORK_ITEM_SIZE\n"); break;
  76. case CL_INVALID_GLOBAL_OFFSET: printf("CL_INVALID_GLOBAL_OFFSET\n"); break;
  77. case CL_INVALID_EVENT_WAIT_LIST: printf("CL_INVALID_EVENT_WAIT_LIST\n"); break;
  78. case CL_INVALID_EVENT: printf("CL_INVALID_EVENT\n"); break;
  79. case CL_INVALID_OPERATION: printf("CL_INVALID_OPERATION\n"); break;
  80. case CL_INVALID_GL_OBJECT: printf("CL_INVALID_GL_OBJECT\n"); break;
  81. case CL_INVALID_BUFFER_SIZE: printf("CL_INVALID_BUFFER_SIZE\n"); break;
  82. case CL_INVALID_MIP_LEVEL: printf("CL_INVALID_MIP_LEVEL\n"); break;
  83. case CL_INVALID_GLOBAL_WORK_SIZE: printf("CL_INVALID_GLOBAL_WORK_SIZE\n"); break;
  84. #ifdef CL_VERSION_1_1
  85. case CL_MISALIGNED_SUB_BUFFER_OFFSET: printf("CL_MISALIGNED_SUB_BUFFER_OFFSET\n"); break;
  86. case CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST: printf("CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST\n"); break;
  87. /* case CL_INVALID_PROPERTY: printf("CL_INVALID_PROPERTY\n"); break; */
  88. #endif
  89. default: printf("Invalid OpenCL error code\n");
  90. }
  91. exit(error);
  92. }