starpu_opencl.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /* StarPU --- Runtime system for heterogeneous multicore architectures.
  2. *
  3. * Copyright (C) 2010, 2011 Université de Bordeaux 1
  4. * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique
  5. *
  6. * StarPU is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU Lesser General Public License as published by
  8. * the Free Software Foundation; either version 2.1 of the License, or (at
  9. * your option) any later version.
  10. *
  11. * StarPU is distributed in the hope that it will be useful, but
  12. * WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14. *
  15. * See the GNU Lesser General Public License in COPYING.LGPL for more details.
  16. */
  17. #ifndef __STARPU_OPENCL_H__
  18. #define __STARPU_OPENCL_H__
  19. #ifdef STARPU_USE_OPENCL
  20. #ifdef __APPLE__
  21. #include <OpenCL/cl.h>
  22. #else
  23. #include <CL/cl.h>
  24. #endif
  25. #ifdef __cplusplus
  26. extern "C" {
  27. #endif
  28. #define STARPU_OPENCL_DISPLAY_ERROR(status) \
  29. do { \
  30. const char *errormsg; \
  31. switch (status) { \
  32. case CL_SUCCESS: \
  33. errormsg = "success"; \
  34. break; \
  35. case CL_DEVICE_NOT_FOUND: \
  36. errormsg = "Device not found"; \
  37. break; \
  38. case CL_DEVICE_NOT_AVAILABLE: \
  39. errormsg = "Device not available"; \
  40. break; \
  41. case CL_COMPILER_NOT_AVAILABLE: \
  42. errormsg = "Compiler not available"; \
  43. break; \
  44. case CL_MEM_OBJECT_ALLOCATION_FAILURE: \
  45. errormsg = "Memory object allocation failure"; \
  46. break; \
  47. case CL_OUT_OF_RESOURCES: \
  48. errormsg = "Out of resources"; \
  49. break; \
  50. case CL_OUT_OF_HOST_MEMORY: \
  51. errormsg = "Out of host memory"; \
  52. break; \
  53. case CL_PROFILING_INFO_NOT_AVAILABLE: \
  54. errormsg = "Profiling info not available"; \
  55. break; \
  56. case CL_MEM_COPY_OVERLAP: \
  57. errormsg = "Memory copy overlap"; \
  58. break; \
  59. case CL_IMAGE_FORMAT_MISMATCH: \
  60. errormsg = "Image format mismatch"; \
  61. break; \
  62. case CL_IMAGE_FORMAT_NOT_SUPPORTED: \
  63. errormsg = "Image format not supported"; \
  64. break; \
  65. case CL_BUILD_PROGRAM_FAILURE: \
  66. errormsg = "Build program failure"; \
  67. break; \
  68. case CL_MAP_FAILURE: \
  69. errormsg = "Map failure"; \
  70. break; \
  71. case CL_INVALID_VALUE: \
  72. errormsg = "Invalid value"; \
  73. break; \
  74. case CL_INVALID_DEVICE_TYPE: \
  75. errormsg = "Invalid device type"; \
  76. break; \
  77. case CL_INVALID_PLATFORM: \
  78. errormsg = "Invalid platform"; \
  79. break; \
  80. case CL_INVALID_DEVICE: \
  81. errormsg = "Invalid device"; \
  82. break; \
  83. case CL_INVALID_CONTEXT: \
  84. errormsg = "Invalid context"; \
  85. break; \
  86. case CL_INVALID_QUEUE_PROPERTIES: \
  87. errormsg = "Invalid queue properties"; \
  88. break; \
  89. case CL_INVALID_COMMAND_QUEUE: \
  90. errormsg = "Invalid command queue"; \
  91. break; \
  92. case CL_INVALID_HOST_PTR: \
  93. errormsg = "Invalid host pointer"; \
  94. break; \
  95. case CL_INVALID_MEM_OBJECT: \
  96. errormsg = "Invalid memory object"; \
  97. break; \
  98. case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: \
  99. errormsg = "Invalid image format descriptor"; \
  100. break; \
  101. case CL_INVALID_IMAGE_SIZE: \
  102. errormsg = "Invalid image size"; \
  103. break; \
  104. case CL_INVALID_SAMPLER: \
  105. errormsg = "Invalid sampler"; \
  106. break; \
  107. case CL_INVALID_BINARY: \
  108. errormsg = "Invalid binary"; \
  109. break; \
  110. case CL_INVALID_BUILD_OPTIONS: \
  111. errormsg = "Invalid build options"; \
  112. break; \
  113. case CL_INVALID_PROGRAM: \
  114. errormsg = "Invalid program"; \
  115. break; \
  116. case CL_INVALID_PROGRAM_EXECUTABLE: \
  117. errormsg = "Invalid program executable"; \
  118. break; \
  119. case CL_INVALID_KERNEL_NAME: \
  120. errormsg = "Invalid kernel name"; \
  121. break; \
  122. case CL_INVALID_KERNEL_DEFINITION: \
  123. errormsg = "Invalid kernel definition"; \
  124. break; \
  125. case CL_INVALID_KERNEL: \
  126. errormsg = "Invalid kernel"; \
  127. break; \
  128. case CL_INVALID_ARG_INDEX: \
  129. errormsg = "Invalid argument index"; \
  130. break; \
  131. case CL_INVALID_ARG_VALUE: \
  132. errormsg = "Invalid argument value"; \
  133. break; \
  134. case CL_INVALID_ARG_SIZE: \
  135. errormsg = "Invalid argument size"; \
  136. break; \
  137. case CL_INVALID_KERNEL_ARGS: \
  138. errormsg = "Invalid kernel arguments"; \
  139. break; \
  140. case CL_INVALID_WORK_DIMENSION: \
  141. errormsg = "Invalid work dimension"; \
  142. break; \
  143. case CL_INVALID_WORK_GROUP_SIZE: \
  144. errormsg = "Invalid work group size"; \
  145. break; \
  146. case CL_INVALID_WORK_ITEM_SIZE: \
  147. errormsg = "Invalid work item size"; \
  148. break; \
  149. case CL_INVALID_GLOBAL_OFFSET: \
  150. errormsg = "Invalid global offset"; \
  151. break; \
  152. case CL_INVALID_EVENT_WAIT_LIST: \
  153. errormsg = "Invalid event wait list"; \
  154. break; \
  155. case CL_INVALID_EVENT: \
  156. errormsg = "Invalid event"; \
  157. break; \
  158. case CL_INVALID_OPERATION: \
  159. errormsg = "Invalid operation"; \
  160. break; \
  161. case CL_INVALID_GL_OBJECT: \
  162. errormsg = "Invalid GL object"; \
  163. break; \
  164. case CL_INVALID_BUFFER_SIZE: \
  165. errormsg = "Invalid buffer size"; \
  166. break; \
  167. case CL_INVALID_MIP_LEVEL: \
  168. errormsg = "Invalid MIP level"; \
  169. break; \
  170. default: \
  171. errormsg = "unknown error"; \
  172. break; \
  173. } \
  174. printf("oops in %s ... <%s> (%d) \n", __func__, errormsg, status); \
  175. } while (0)
  176. #define STARPU_OPENCL_REPORT_ERROR(status) \
  177. do { \
  178. STARPU_OPENCL_DISPLAY_ERROR(status); \
  179. assert(0); \
  180. } while (0)
  181. struct starpu_opencl_program {
  182. cl_program programs[STARPU_MAXOPENCLDEVS];
  183. };
  184. void starpu_opencl_get_context(int devid, cl_context *context);
  185. void starpu_opencl_get_device(int devid, cl_device_id *device);
  186. void starpu_opencl_get_queue(int devid, cl_command_queue *queue);
  187. void starpu_opencl_get_current_context(cl_context *context);
  188. void starpu_opencl_get_current_queue(cl_command_queue *queue);
  189. int starpu_opencl_load_opencl_from_file(const char *source_file_name, struct starpu_opencl_program *opencl_programs,
  190. const char* build_options);
  191. int starpu_opencl_load_opencl_from_string(const char *opencl_program_source, struct starpu_opencl_program *opencl_programs,
  192. const char* build_options);
  193. int starpu_opencl_unload_opencl(struct starpu_opencl_program *opencl_programs);
  194. int starpu_opencl_load_kernel(cl_kernel *kernel, cl_command_queue *queue, struct starpu_opencl_program *opencl_programs, const char *kernel_name, int devid);
  195. int starpu_opencl_release_kernel(cl_kernel kernel);
  196. int starpu_opencl_collect_stats(cl_event event);
  197. #ifdef __cplusplus
  198. }
  199. #endif
  200. #endif /* STARPU_USE_OPENCL */
  201. #endif /* __STARPU_OPENCL_H__ */