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