opencl.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. //===============================================================================================================================================================================================================200
  5. // INCLUDE/DEFINE
  6. //===============================================================================================================================================================================================================200
  7. #include "opencl.h" // (in library path specified to compiler)
  8. //===============================================================================================================================================================================================================200
  9. // LOAD KERNEL SOURCE CODE
  10. //===============================================================================================================================================================================================================200
  11. char *
  12. load_kernel_source(const char *filename)
  13. {
  14. // Open the source file
  15. FILE *file = fopen(filename, "r");
  16. if (file == NULL){
  17. fatal("Error opening kernel source file\n");
  18. }
  19. // Determine the size of the file
  20. if (fseek(file, 0, SEEK_END)){
  21. fatal("Error reading kernel source file\n");
  22. }
  23. size_t size = ftell(file);
  24. // Allocate space for the source code (plus one for null-terminator)
  25. char *source = (char *) malloc(size + 1);
  26. // Read the source code into the string
  27. fseek(file, 0, SEEK_SET);
  28. // printf("Number of elements: %lu\nSize = %lu", fread(source, 1, size, file), size);
  29. // exit(1);
  30. if (fread(source, 1, size, file) != size){
  31. fatal("Error reading kernel source file\n");
  32. }
  33. // Null-terminate the string
  34. source[size] = '\0';
  35. // Return the pointer to the string
  36. return source;
  37. }
  38. //===============================================================================================================================================================================================================200
  39. // PRINT ERROR
  40. //===============================================================================================================================================================================================================200
  41. void
  42. fatal(const char *s)
  43. {
  44. fprintf(stderr, "Error: %s\n", s);
  45. exit(1);
  46. }
  47. //===============================================================================================================================================================================================================200
  48. // PRINT OPENCL ERROR
  49. //===============================================================================================================================================================================================================200
  50. void
  51. fatal_CL(cl_int error, int line_no) {
  52. printf("Error at line %d: ", line_no);
  53. switch(error) {
  54. case CL_SUCCESS: printf("CL_SUCCESS\n"); break;
  55. case CL_DEVICE_NOT_FOUND: printf("CL_DEVICE_NOT_FOUND\n"); break;
  56. case CL_DEVICE_NOT_AVAILABLE: printf("CL_DEVICE_NOT_AVAILABLE\n"); break;
  57. case CL_COMPILER_NOT_AVAILABLE: printf("CL_COMPILER_NOT_AVAILABLE\n"); break;
  58. case CL_MEM_OBJECT_ALLOCATION_FAILURE: printf("CL_MEM_OBJECT_ALLOCATION_FAILURE\n"); break;
  59. case CL_OUT_OF_RESOURCES: printf("CL_OUT_OF_RESOURCES\n"); break;
  60. case CL_OUT_OF_HOST_MEMORY: printf("CL_OUT_OF_HOST_MEMORY\n"); break;
  61. case CL_PROFILING_INFO_NOT_AVAILABLE: printf("CL_PROFILING_INFO_NOT_AVAILABLE\n"); break;
  62. case CL_MEM_COPY_OVERLAP: printf("CL_MEM_COPY_OVERLAP\n"); break;
  63. case CL_IMAGE_FORMAT_MISMATCH: printf("CL_IMAGE_FORMAT_MISMATCH\n"); break;
  64. case CL_IMAGE_FORMAT_NOT_SUPPORTED: printf("CL_IMAGE_FORMAT_NOT_SUPPORTED\n"); break;
  65. case CL_BUILD_PROGRAM_FAILURE: printf("CL_BUILD_PROGRAM_FAILURE\n"); break;
  66. case CL_MAP_FAILURE: printf("CL_MAP_FAILURE\n"); break;
  67. case CL_INVALID_VALUE: printf("CL_INVALID_VALUE\n"); break;
  68. case CL_INVALID_DEVICE_TYPE: printf("CL_INVALID_DEVICE_TYPE\n"); break;
  69. case CL_INVALID_PLATFORM: printf("CL_INVALID_PLATFORM\n"); break;
  70. case CL_INVALID_DEVICE: printf("CL_INVALID_DEVICE\n"); break;
  71. case CL_INVALID_CONTEXT: printf("CL_INVALID_CONTEXT\n"); break;
  72. case CL_INVALID_QUEUE_PROPERTIES: printf("CL_INVALID_QUEUE_PROPERTIES\n"); break;
  73. case CL_INVALID_COMMAND_QUEUE: printf("CL_INVALID_COMMAND_QUEUE\n"); break;
  74. case CL_INVALID_HOST_PTR: printf("CL_INVALID_HOST_PTR\n"); break;
  75. case CL_INVALID_MEM_OBJECT: printf("CL_INVALID_MEM_OBJECT\n"); break;
  76. case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: printf("CL_INVALID_IMAGE_FORMAT_DESCRIPTOR\n"); break;
  77. case CL_INVALID_IMAGE_SIZE: printf("CL_INVALID_IMAGE_SIZE\n"); break;
  78. case CL_INVALID_SAMPLER: printf("CL_INVALID_SAMPLER\n"); break;
  79. case CL_INVALID_BINARY: printf("CL_INVALID_BINARY\n"); break;
  80. case CL_INVALID_BUILD_OPTIONS: printf("CL_INVALID_BUILD_OPTIONS\n"); break;
  81. case CL_INVALID_PROGRAM: printf("CL_INVALID_PROGRAM\n"); break;
  82. case CL_INVALID_PROGRAM_EXECUTABLE: printf("CL_INVALID_PROGRAM_EXECUTABLE\n"); break;
  83. case CL_INVALID_KERNEL_NAME: printf("CL_INVALID_KERNEL_NAME\n"); break;
  84. case CL_INVALID_KERNEL_DEFINITION: printf("CL_INVALID_KERNEL_DEFINITION\n"); break;
  85. case CL_INVALID_KERNEL: printf("CL_INVALID_KERNEL\n"); break;
  86. case CL_INVALID_ARG_INDEX: printf("CL_INVALID_ARG_INDEX\n"); break;
  87. case CL_INVALID_ARG_VALUE: printf("CL_INVALID_ARG_VALUE\n"); break;
  88. case CL_INVALID_ARG_SIZE: printf("CL_INVALID_ARG_SIZE\n"); break;
  89. case CL_INVALID_KERNEL_ARGS: printf("CL_INVALID_KERNEL_ARGS\n"); break;
  90. case CL_INVALID_WORK_DIMENSION: printf("CL_INVALID_WORK_DIMENSION\n"); break;
  91. case CL_INVALID_WORK_GROUP_SIZE: printf("CL_INVALID_WORK_GROUP_SIZE\n"); break;
  92. case CL_INVALID_WORK_ITEM_SIZE: printf("CL_INVALID_WORK_ITEM_SIZE\n"); break;
  93. case CL_INVALID_GLOBAL_OFFSET: printf("CL_INVALID_GLOBAL_OFFSET\n"); break;
  94. case CL_INVALID_EVENT_WAIT_LIST: printf("CL_INVALID_EVENT_WAIT_LIST\n"); break;
  95. case CL_INVALID_EVENT: printf("CL_INVALID_EVENT\n"); break;
  96. case CL_INVALID_OPERATION: printf("CL_INVALID_OPERATION\n"); break;
  97. case CL_INVALID_GL_OBJECT: printf("CL_INVALID_GL_OBJECT\n"); break;
  98. case CL_INVALID_BUFFER_SIZE: printf("CL_INVALID_BUFFER_SIZE\n"); break;
  99. case CL_INVALID_MIP_LEVEL: printf("CL_INVALID_MIP_LEVEL\n"); break;
  100. case CL_INVALID_GLOBAL_WORK_SIZE: printf("CL_INVALID_GLOBAL_WORK_SIZE\n"); break;
  101. #ifdef CL_VERSION_1_1
  102. case CL_MISALIGNED_SUB_BUFFER_OFFSET: printf("CL_MISALIGNED_SUB_BUFFER_OFFSET\n"); break;
  103. case CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST: printf("CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST\n"); break;
  104. /* case CL_INVALID_PROPERTY: printf("CL_INVALID_PROPERTY\n"); break; */
  105. #endif
  106. default: printf("Invalid OpenCL error code\n");
  107. }
  108. exit(error);
  109. }
  110. //===============================================================================================================================================================================================================200
  111. // END
  112. //===============================================================================================================================================================================================================200
  113. #ifdef __cplusplus
  114. }
  115. #endif