init_run_deinit.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. #include <starpu.h>
  2. #include <starpu_opencl.h>
  3. #include "../../helper.h"
  4. #define NTASKS 8
  5. #if defined(STARPU_USE_CPU) || defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL)
  6. static void
  7. dummy(void *buffers[], void *args)
  8. {
  9. (void) buffers;
  10. (*(int *)args)++;
  11. }
  12. static struct starpu_codelet cl =
  13. {
  14. .cpu_funcs = { dummy, NULL },
  15. .cuda_funcs = { dummy, NULL },
  16. .opencl_funcs = { dummy, NULL },
  17. .nbuffers = 0
  18. };
  19. static void
  20. init_driver(struct starpu_driver *d)
  21. {
  22. int ret;
  23. ret = starpu_driver_init(d);
  24. STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_init");
  25. }
  26. static void
  27. run(struct starpu_task *task, struct starpu_driver *d)
  28. {
  29. int ret;
  30. ret = starpu_task_submit(task);
  31. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
  32. ret = starpu_driver_run_once(d);
  33. STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_run_once");
  34. }
  35. static void
  36. deinit_driver(struct starpu_driver *d)
  37. {
  38. int ret;
  39. ret = starpu_driver_deinit(d);
  40. STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_deinit");
  41. }
  42. #endif /* STARPU_USE_CPU || STARPU_USE_CUDA || STARPU_USE_OPENCL */
  43. #ifdef STARPU_USE_CPU
  44. static int
  45. test_cpu(void)
  46. {
  47. int var = 0, ret;
  48. struct starpu_conf conf;
  49. ret = starpu_conf_init(&conf);
  50. if (ret == -EINVAL)
  51. return 1;
  52. struct starpu_driver d =
  53. {
  54. .type = STARPU_CPU_WORKER,
  55. .id.cpu_id = 0
  56. };
  57. conf.not_launched_drivers = &d;
  58. conf.n_not_launched_drivers = 1;
  59. ret = starpu_init(&conf);
  60. if (ret == -ENODEV)
  61. return STARPU_TEST_SKIPPED;
  62. init_driver(&d);
  63. int i;
  64. for (i = 0; i < NTASKS; i++)
  65. {
  66. struct starpu_task *task;
  67. task = starpu_task_create();
  68. cl.where = STARPU_CPU;
  69. task->cl = &cl;
  70. task->cl_arg = &var;
  71. run(task, &d);
  72. }
  73. deinit_driver(&d);
  74. starpu_task_wait_for_all();
  75. starpu_shutdown();
  76. FPRINTF(stderr, "[CPU] Var is %d\n", var);
  77. return !!(var != NTASKS);
  78. }
  79. #endif /* STARPU_USE_CPU */
  80. #ifdef STARPU_USE_CUDA
  81. static int
  82. test_cuda(void)
  83. {
  84. int var = 0, ret, ncuda;
  85. struct starpu_conf conf;
  86. ret = starpu_conf_init(&conf);
  87. if (ret == -EINVAL)
  88. return 1;
  89. struct starpu_driver d =
  90. {
  91. .type = STARPU_CUDA_WORKER,
  92. .id.cuda_id = 0
  93. };
  94. conf.ncuda = 1;
  95. conf.nopencl = 0;
  96. conf.not_launched_drivers = &d;
  97. conf.n_not_launched_drivers = 1;
  98. ret = starpu_init(&conf);
  99. if (ret == -ENODEV)
  100. return STARPU_TEST_SKIPPED;
  101. ncuda = starpu_cuda_worker_get_count();
  102. if (ncuda == 0)
  103. return STARPU_TEST_SKIPPED;
  104. init_driver(&d);
  105. int i;
  106. for (i = 0; i < NTASKS; i++)
  107. {
  108. struct starpu_task *task;
  109. task = starpu_task_create();
  110. cl.where = STARPU_CUDA;
  111. task->cl = &cl;
  112. task->cl_arg = &var;
  113. run(task, &d);
  114. }
  115. deinit_driver(&d);
  116. starpu_task_wait_for_all();
  117. starpu_shutdown();
  118. FPRINTF(stderr, "[CUDA] Var is %d\n", var);
  119. return !!(var != NTASKS);
  120. }
  121. #endif /* STARPU_USE_CUDA */
  122. #ifdef STARPU_USE_OPENCL
  123. static int
  124. test_opencl(void)
  125. {
  126. cl_int err;
  127. cl_platform_id platform;
  128. cl_uint dummy;
  129. int opencl;
  130. err = clGetPlatformIDs(1, &platform, &dummy);
  131. if (err != CL_SUCCESS)
  132. {
  133. return STARPU_TEST_SKIPPED;
  134. }
  135. cl_device_id device_id;
  136. err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL);
  137. if (err != CL_SUCCESS)
  138. {
  139. return STARPU_TEST_SKIPPED;
  140. }
  141. int var = 0, ret;
  142. struct starpu_conf conf;
  143. ret = starpu_conf_init(&conf);
  144. if (ret == -EINVAL)
  145. return 1;
  146. struct starpu_driver d =
  147. {
  148. .type = STARPU_OPENCL_WORKER,
  149. .id.opencl_id = device_id
  150. };
  151. conf.ncuda = 0;
  152. conf.nopencl = 1;
  153. conf.not_launched_drivers = &d;
  154. conf.n_not_launched_drivers = 1;
  155. ret = starpu_init(&conf);
  156. if (ret == -ENODEV)
  157. return STARPU_TEST_SKIPPED;
  158. nopencl = starpu_opencl_worker_get_count();
  159. if (nopencl == 0)
  160. return STARPU_TEST_SKIPPED;
  161. init_driver(&d);
  162. int i;
  163. for (i = 0; i < NTASKS; i++)
  164. {
  165. struct starpu_task *task;
  166. task = starpu_task_create();
  167. cl.where = STARPU_OPENCL;
  168. task->cl = &cl;
  169. task->cl_arg = &var;
  170. run(task, &d);
  171. }
  172. deinit_driver(&d);
  173. starpu_task_wait_for_all();
  174. starpu_shutdown();
  175. FPRINTF(stderr, "[OpenCL] Var is %d\n", var);
  176. return !!(var != NTASKS);
  177. }
  178. #endif /* STARPU_USE_OPENCL */
  179. int
  180. main(void)
  181. {
  182. int ret = STARPU_TEST_SKIPPED;
  183. #ifdef STARPU_USE_CPU
  184. ret = test_cpu();
  185. if (ret == 1)
  186. return ret;
  187. #endif
  188. #ifdef STARPU_USE_CUDA
  189. ret = test_cuda();
  190. if (ret == 1)
  191. return ret;
  192. #endif
  193. #ifdef STARPU_USE_OPENCL
  194. ret = test_opencl();
  195. if (ret == 1)
  196. return ret;
  197. #endif
  198. return ret;
  199. }