insert_task_many.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. /* StarPU --- Runtime system for heterogeneous multicore architectures.
  2. *
  3. * Copyright (C) 2011-2015,2017 CNRS
  4. * Copyright (C) 2015-2016 Université de Bordeaux
  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. #include <starpu.h>
  18. #include <starpu_config.h>
  19. #include "../helper.h"
  20. /*
  21. * Try to pass many parameters to a task, testing the various codelet
  22. * declarations
  23. */
  24. #define NPARAMS 15
  25. void func_cpu(void *descr[], void *_args)
  26. {
  27. (void)_args;
  28. struct starpu_task *task = starpu_task_get_current();
  29. int num = STARPU_TASK_GET_NBUFFERS(task);
  30. int i;
  31. for (i = 0; i < num; i++)
  32. if ((STARPU_TASK_GET_MODE(task, i) & STARPU_W)
  33. || (STARPU_TASK_GET_MODE(task, i) & STARPU_SCRATCH))
  34. {
  35. int *x = (int *)STARPU_VARIABLE_GET_PTR(descr[i]);
  36. *x = *x + 1;
  37. }
  38. }
  39. /* We will fill this one with dyn_modes */
  40. struct starpu_codelet codelet_dyn =
  41. {
  42. .cpu_funcs = {func_cpu},
  43. /* starpu_task_get_current() doesn't work on MIC */
  44. /* .cpu_funcs_name = {"func_cpu"}, */
  45. .nbuffers = NPARAMS,
  46. };
  47. /* This will warn out at compilation time when maxbuffers is less than NPARAMS.
  48. * That is on purpose: we here check that we still behave correctly in that case.
  49. * We are just not able to check the parameter access modes. */
  50. struct starpu_codelet codelet_toomany =
  51. {
  52. .cpu_funcs = {func_cpu},
  53. /* starpu_task_get_current() doesn't work on MIC */
  54. /* .cpu_funcs_name = {"func_cpu"}, */
  55. .nbuffers = NPARAMS,
  56. .modes =
  57. {
  58. STARPU_R,
  59. STARPU_R,
  60. STARPU_RW|STARPU_COMMUTE,
  61. STARPU_RW|STARPU_COMMUTE,
  62. STARPU_R,
  63. STARPU_RW,
  64. STARPU_R,
  65. STARPU_RW|STARPU_COMMUTE,
  66. STARPU_R,
  67. STARPU_RW|STARPU_COMMUTE,
  68. STARPU_R,
  69. STARPU_R,
  70. STARPU_SCRATCH,
  71. STARPU_SCRATCH,
  72. STARPU_SCRATCH,
  73. }
  74. };
  75. struct starpu_codelet codelet_variable =
  76. {
  77. .cpu_funcs = {func_cpu},
  78. /* starpu_task_get_current() doesn't work on MIC */
  79. /* .cpu_funcs_name = {"func_cpu"}, */
  80. .nbuffers = STARPU_VARIABLE_NBUFFERS,
  81. };
  82. int main(void)
  83. {
  84. int *x;
  85. int i, ret, loop;
  86. #ifdef STARPU_QUICK_CHECK
  87. int nloops = 4;
  88. #else
  89. int nloops = 16;
  90. #endif
  91. int val_int = 42;
  92. double val_double = 42.;
  93. starpu_data_handle_t *data_handles;
  94. int *expected;
  95. ret = starpu_init(NULL);
  96. if (ret == -ENODEV) return STARPU_TEST_SKIPPED;
  97. STARPU_CHECK_RETURN_VALUE(ret, "starpu_init");
  98. codelet_dyn.dyn_modes = malloc(NPARAMS * sizeof(*(codelet_dyn.modes)));
  99. codelet_dyn.dyn_modes[0] = STARPU_R,
  100. codelet_dyn.dyn_modes[1] = STARPU_R,
  101. codelet_dyn.dyn_modes[2] = STARPU_RW|STARPU_COMMUTE,
  102. codelet_dyn.dyn_modes[3] = STARPU_RW|STARPU_COMMUTE,
  103. codelet_dyn.dyn_modes[4] = STARPU_R,
  104. codelet_dyn.dyn_modes[5] = STARPU_RW,
  105. codelet_dyn.dyn_modes[6] = STARPU_R,
  106. codelet_dyn.dyn_modes[7] = STARPU_RW|STARPU_COMMUTE,
  107. codelet_dyn.dyn_modes[8] = STARPU_R,
  108. codelet_dyn.dyn_modes[9] = STARPU_RW|STARPU_COMMUTE,
  109. codelet_dyn.dyn_modes[10] = STARPU_R,
  110. codelet_dyn.dyn_modes[11] = STARPU_R,
  111. codelet_dyn.dyn_modes[12] = STARPU_SCRATCH,
  112. codelet_dyn.dyn_modes[13] = STARPU_SCRATCH,
  113. codelet_dyn.dyn_modes[14] = STARPU_SCRATCH,
  114. x = calloc(NPARAMS, sizeof(*x));
  115. data_handles = malloc(NPARAMS * sizeof(*data_handles));
  116. expected = calloc(NPARAMS, sizeof(*expected));
  117. for(i=0 ; i<NPARAMS ; i++)
  118. starpu_variable_data_register(&data_handles[i], STARPU_MAIN_RAM, (uintptr_t)&x[i], sizeof(x[i]));
  119. for (loop = 0; loop < nloops; loop++)
  120. {
  121. for (i = 0; i < NPARAMS; i++)
  122. {
  123. if (codelet_dyn.dyn_modes[i] & STARPU_W)
  124. expected[i]++;
  125. }
  126. ret = starpu_task_insert(&codelet_dyn,
  127. STARPU_R, data_handles[0],
  128. STARPU_R, data_handles[1],
  129. STARPU_RW|STARPU_COMMUTE, data_handles[2],
  130. STARPU_RW|STARPU_COMMUTE, data_handles[3],
  131. STARPU_R, data_handles[4],
  132. STARPU_RW, data_handles[5],
  133. STARPU_R, data_handles[6],
  134. STARPU_RW|STARPU_COMMUTE, data_handles[7],
  135. STARPU_R, data_handles[8],
  136. STARPU_RW|STARPU_COMMUTE, data_handles[9],
  137. STARPU_R, data_handles[10],
  138. STARPU_R, data_handles[11],
  139. STARPU_SCRATCH, data_handles[12],
  140. STARPU_SCRATCH, data_handles[13],
  141. STARPU_SCRATCH, data_handles[14],
  142. 0);
  143. if (ret == -ENODEV) goto enodev;
  144. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
  145. /* Same, but using the toomany codelet */
  146. for (i = 0; i < NPARAMS; i++)
  147. {
  148. if (codelet_dyn.dyn_modes[i] & STARPU_W)
  149. expected[i]++;
  150. }
  151. ret = starpu_task_insert(&codelet_toomany,
  152. STARPU_R, data_handles[0],
  153. STARPU_R, data_handles[1],
  154. STARPU_RW|STARPU_COMMUTE, data_handles[2],
  155. STARPU_RW|STARPU_COMMUTE, data_handles[3],
  156. STARPU_R, data_handles[4],
  157. STARPU_RW, data_handles[5],
  158. STARPU_R, data_handles[6],
  159. STARPU_RW|STARPU_COMMUTE, data_handles[7],
  160. STARPU_R, data_handles[8],
  161. STARPU_RW|STARPU_COMMUTE, data_handles[9],
  162. STARPU_R, data_handles[10],
  163. STARPU_R, data_handles[11],
  164. STARPU_SCRATCH, data_handles[12],
  165. STARPU_SCRATCH, data_handles[13],
  166. STARPU_SCRATCH, data_handles[14],
  167. 0);
  168. if (ret == -ENODEV) goto enodev;
  169. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
  170. /* Same, but using the variable codelet */
  171. for (i = 0; i < NPARAMS; i++)
  172. {
  173. if (codelet_dyn.dyn_modes[i] & STARPU_W)
  174. expected[i]++;
  175. }
  176. ret = starpu_task_insert(&codelet_variable,
  177. STARPU_R, data_handles[0],
  178. STARPU_R, data_handles[1],
  179. STARPU_RW|STARPU_COMMUTE, data_handles[2],
  180. STARPU_RW|STARPU_COMMUTE, data_handles[3],
  181. STARPU_R, data_handles[4],
  182. STARPU_RW, data_handles[5],
  183. STARPU_R, data_handles[6],
  184. STARPU_RW|STARPU_COMMUTE, data_handles[7],
  185. STARPU_R, data_handles[8],
  186. STARPU_RW|STARPU_COMMUTE, data_handles[9],
  187. STARPU_R, data_handles[10],
  188. STARPU_R, data_handles[11],
  189. STARPU_SCRATCH, data_handles[12],
  190. STARPU_SCRATCH, data_handles[13],
  191. STARPU_SCRATCH, data_handles[14],
  192. 0);
  193. if (ret == -ENODEV) goto enodev;
  194. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
  195. }
  196. enodev:
  197. for(i=0 ; i<NPARAMS ; i++)
  198. {
  199. starpu_data_unregister(data_handles[i]);
  200. }
  201. starpu_shutdown();
  202. free(data_handles);
  203. free(codelet_dyn.dyn_modes);
  204. if (ret == -ENODEV)
  205. {
  206. fprintf(stderr, "WARNING: No one can execute this task\n");
  207. /* yes, we do not perform the computation but we did detect that no one
  208. * could perform the kernel, so this is not an error from StarPU */
  209. free(x);
  210. free(expected);
  211. return STARPU_TEST_SKIPPED;
  212. }
  213. else
  214. {
  215. for(i=0 ; i<NPARAMS; i++)
  216. {
  217. if (x[i] != expected[i])
  218. {
  219. FPRINTF(stderr, "[end loop] value[%d] = %d != Expected value %d\n", i, x[i], expected[i]);
  220. ret = 1;
  221. }
  222. }
  223. if (ret == 0)
  224. {
  225. FPRINTF(stderr, "[end of loop] all values are correct\n");
  226. }
  227. free(x);
  228. free(expected);
  229. return ret;
  230. }
  231. }