init_run_deinit.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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;
  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. init_driver(&d);
  102. int i;
  103. for (i = 0; i < NTASKS; i++)
  104. {
  105. struct starpu_task *task;
  106. task = starpu_task_create();
  107. cl.where = STARPU_CUDA;
  108. task->cl = &cl;
  109. task->cl_arg = &var;
  110. run(task, &d);
  111. }
  112. deinit_driver(&d);
  113. starpu_task_wait_for_all();
  114. starpu_shutdown();
  115. fprintf(stderr, "[CUDA] Var is %d\n", var);
  116. return !!(var != NTASKS);
  117. }
  118. #endif /* STARPU_USE_CUDA */
  119. #ifdef STARPU_USE_OPENCL
  120. static int
  121. test_opencl(void)
  122. {
  123. cl_int err;
  124. cl_platform_id platform;
  125. cl_uint dummy;
  126. err = clGetPlatformIDs(1, &platform, &dummy);
  127. if (err != CL_SUCCESS)
  128. {
  129. fprintf(stderr, "%s:%d\n", __func__, __LINE__);
  130. return 1;
  131. }
  132. cl_device_id device_id;
  133. err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL);
  134. if (err != CL_SUCCESS)
  135. {
  136. fprintf(stderr, "%s:%d\n", __func__, __LINE__);
  137. return 1;
  138. }
  139. int var = 0, ret;
  140. struct starpu_conf conf;
  141. ret = starpu_conf_init(&conf);
  142. if (ret == -EINVAL)
  143. return 1;
  144. struct starpu_driver d =
  145. {
  146. .type = STARPU_OPENCL_WORKER,
  147. .id.opencl_id = device_id
  148. };
  149. conf.ncuda = 0;
  150. conf.nopencl = 1;
  151. conf.not_launched_drivers = &d;
  152. conf.n_not_launched_drivers = 1;
  153. ret = starpu_init(&conf);
  154. if (ret == -ENODEV)
  155. return STARPU_TEST_SKIPPED;
  156. init_driver(&d);
  157. int i;
  158. for (i = 0; i < NTASKS; i++)
  159. {
  160. struct starpu_task *task;
  161. task = starpu_task_create();
  162. cl.where = STARPU_OPENCL;
  163. task->cl = &cl;
  164. task->cl_arg = &var;
  165. run(task, &d);
  166. }
  167. deinit_driver(&d);
  168. starpu_task_wait_for_all();
  169. starpu_shutdown();
  170. FPRINTF(stderr, "[OpenCL] Var is %d\n", var);
  171. return !!(var != NTASKS);
  172. }
  173. #endif /* STARPU_USE_OPENCL */
  174. int
  175. main(void)
  176. {
  177. int ret = STARPU_TEST_SKIPPED;
  178. #ifdef STARPU_USE_CPU
  179. ret = test_cpu();
  180. if (ret == 1)
  181. return ret;
  182. #endif
  183. #ifdef STARPU_USE_CUDA
  184. ret = test_cuda();
  185. if (ret == 1)
  186. return ret;
  187. #endif
  188. #ifdef STARPU_USE_OPENCL
  189. ret = test_opencl();
  190. if (ret == 1)
  191. return ret;
  192. #endif
  193. return ret;
  194. }