starpu_opencl.h 9.1 KB

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