insert_task_value.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. /* StarPU --- Runtime system for heterogeneous multicore architectures.
  2. *
  3. * Copyright (C) 2015, 2016, 2017 CNRS
  4. *
  5. * StarPU is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU Lesser General Public License as published by
  7. * the Free Software Foundation; either version 2.1 of the License, or (at
  8. * your option) any later version.
  9. *
  10. * StarPU is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. *
  14. * See the GNU Lesser General Public License in COPYING.LGPL for more details.
  15. */
  16. #include <config.h>
  17. #include <starpu.h>
  18. #include "../helper.h"
  19. /*
  20. * Test passing values to tasks in different ways
  21. */
  22. #define IFACTOR 42
  23. #define FFACTOR 12.00
  24. void func_cpu_int_float(void *descr[], void *_args)
  25. {
  26. int ifactor[2048];
  27. float ffactor;
  28. (void) descr;
  29. starpu_codelet_unpack_args(_args, ifactor, &ffactor);
  30. FPRINTF(stderr, "[func_cpu_int_float ] Values %d - %3.2f\n", ifactor[0], ffactor);
  31. assert(ifactor[0] == IFACTOR && ffactor == FFACTOR);
  32. }
  33. void func_cpu_int_float_multiple_unpack(void *descr[], void *_args)
  34. {
  35. int ifactor[2048];
  36. float ffactor;
  37. (void) descr;
  38. starpu_codelet_unpack_args(_args, ifactor, 0);
  39. starpu_codelet_unpack_args(_args, ifactor, &ffactor);
  40. FPRINTF(stderr, "[func_cpu_int_float_multiple_unpack] Values %d - %3.2f\n", ifactor[0], ffactor);
  41. assert(ifactor[0] == IFACTOR && ffactor == FFACTOR);
  42. }
  43. void func_cpu_int_float_unpack_copyleft(void *descr[], void *_args)
  44. {
  45. int ifactor[2048];
  46. float ffactor;
  47. void *buffer;
  48. size_t buffer_size;
  49. (void) descr;
  50. buffer_size = sizeof(int)+sizeof(float)+sizeof(size_t);
  51. buffer = calloc(buffer_size, 1);
  52. starpu_codelet_unpack_args_and_copyleft(_args, buffer, buffer_size, ifactor, 0);
  53. starpu_codelet_unpack_args(buffer, &ffactor);
  54. FPRINTF(stderr, "[func_cpu_int_float_unpack_copyleft] Values %d - %3.2f\n", ifactor[0], ffactor);
  55. assert(ifactor[0] == IFACTOR && ffactor == FFACTOR);
  56. free(buffer);
  57. }
  58. void func_cpu_float_int(void *descr[], void *_args)
  59. {
  60. int ifactor[2048];
  61. float ffactor;
  62. (void) descr;
  63. starpu_codelet_unpack_args(_args, &ffactor, ifactor);
  64. FPRINTF(stderr, "[func_cpu_float_int ] Values %d - %3.2f\n", ifactor[0], ffactor);
  65. assert(ifactor[0] == IFACTOR && ffactor == FFACTOR);
  66. }
  67. void func_cpu_float_int_multiple_unpack(void *descr[], void *_args)
  68. {
  69. int ifactor[2048];
  70. float ffactor;
  71. (void) descr;
  72. starpu_codelet_unpack_args(_args, &ffactor, 0);
  73. starpu_codelet_unpack_args(_args, &ffactor, ifactor);
  74. FPRINTF(stderr, "[func_cpu_float_int_multiple_unpack] Values %d - %3.2f\n", ifactor[0], ffactor);
  75. assert(ifactor[0] == IFACTOR && ffactor == FFACTOR);
  76. }
  77. void func_cpu_float_int_unpack_copyleft(void *descr[], void *_args)
  78. {
  79. int ifactor[2048];
  80. float ffactor;
  81. void *buffer;
  82. size_t buffer_size;
  83. (void) descr;
  84. buffer_size = sizeof(int)+2048*sizeof(int)+sizeof(size_t);
  85. buffer = calloc(buffer_size, 1);
  86. starpu_codelet_unpack_args_and_copyleft(_args, buffer, buffer_size, &ffactor, 0);
  87. starpu_codelet_unpack_args(buffer, ifactor);
  88. FPRINTF(stderr, "[func_cpu_float_int_multiple_unpack] Values %d - %3.2f\n", ifactor[0], ffactor);
  89. assert(ifactor[0] == IFACTOR && ffactor == FFACTOR);
  90. free(buffer);
  91. }
  92. void do_test_int_float_task_insert(starpu_cpu_func_t func, char* func_name)
  93. {
  94. int *ifactor;
  95. float ffactor=FFACTOR;
  96. int ret;
  97. struct starpu_codelet codelet;
  98. FPRINTF(stderr, "\nTesting %s\n", __func__);
  99. starpu_codelet_init(&codelet);
  100. codelet.cpu_funcs[0] = func;
  101. codelet.cpu_funcs_name[0] = func_name;
  102. ifactor = calloc(2048, sizeof(int));
  103. ifactor[0] = IFACTOR;
  104. ret = starpu_task_insert(&codelet,
  105. STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]),
  106. STARPU_VALUE, &ffactor, sizeof(ffactor),
  107. 0);
  108. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
  109. starpu_task_wait_for_all();
  110. free(ifactor);
  111. }
  112. void do_test_int_float_task_insert_pack(starpu_cpu_func_t func, char* func_name)
  113. {
  114. int *ifactor;
  115. float ffactor=FFACTOR;
  116. int ret;
  117. struct starpu_codelet codelet;
  118. void *cl_arg = NULL;
  119. size_t cl_arg_size = 0;
  120. FPRINTF(stderr, "\nTesting %s\n", __func__);
  121. ifactor = calloc(2048, sizeof(int));
  122. ifactor[0] = IFACTOR;
  123. starpu_codelet_pack_args(&cl_arg, &cl_arg_size,
  124. STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]),
  125. STARPU_VALUE, &ffactor, sizeof(ffactor),
  126. 0);
  127. starpu_codelet_init(&codelet);
  128. codelet.cpu_funcs[0] = func;
  129. codelet.cpu_funcs_name[0] = func_name;
  130. ret = starpu_task_insert(&codelet,
  131. STARPU_CL_ARGS, cl_arg, cl_arg_size,
  132. 0);
  133. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
  134. starpu_task_wait_for_all();
  135. free(ifactor);
  136. }
  137. void do_test_float_int_task_insert(starpu_cpu_func_t func, char* func_name)
  138. {
  139. int *ifactor;
  140. float ffactor=FFACTOR;
  141. int ret;
  142. struct starpu_codelet codelet;
  143. FPRINTF(stderr, "\nTesting %s\n", __func__);
  144. starpu_codelet_init(&codelet);
  145. codelet.cpu_funcs[0] = func;
  146. codelet.cpu_funcs_name[0] = func_name;
  147. ifactor = calloc(2048, sizeof(int));
  148. ifactor[0] = IFACTOR;
  149. ret = starpu_task_insert(&codelet,
  150. STARPU_VALUE, &ffactor, sizeof(ffactor),
  151. STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]),
  152. 0);
  153. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
  154. starpu_task_wait_for_all();
  155. free(ifactor);
  156. }
  157. void do_test_float_int_task_insert_pack(starpu_cpu_func_t func, char* func_name)
  158. {
  159. int *ifactor;
  160. float ffactor=FFACTOR;
  161. int ret;
  162. struct starpu_codelet codelet;
  163. void *cl_arg = NULL;
  164. size_t cl_arg_size = 0;
  165. FPRINTF(stderr, "\nTesting %s\n", __func__);
  166. ifactor = calloc(2048, sizeof(int));
  167. ifactor[0] = IFACTOR;
  168. starpu_codelet_pack_args(&cl_arg, &cl_arg_size,
  169. STARPU_VALUE, &ffactor, sizeof(ffactor),
  170. STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]),
  171. 0);
  172. starpu_codelet_init(&codelet);
  173. codelet.cpu_funcs[0] = func;
  174. codelet.cpu_funcs_name[0] = func_name;
  175. ret = starpu_task_insert(&codelet,
  176. STARPU_CL_ARGS, cl_arg, cl_arg_size,
  177. 0);
  178. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
  179. starpu_task_wait_for_all();
  180. free(ifactor);
  181. }
  182. void do_test_int_float_pack(starpu_cpu_func_t func, char* func_name)
  183. {
  184. struct starpu_task *task;
  185. struct starpu_codelet codelet;
  186. int ret;
  187. int *ifactor;
  188. float ffactor=FFACTOR;
  189. FPRINTF(stderr, "\nTesting %s\n", __func__);
  190. ifactor = calloc(2048, sizeof(int));
  191. ifactor[0] = IFACTOR;
  192. starpu_codelet_init(&codelet);
  193. codelet.cpu_funcs[0] = func;
  194. codelet.cpu_funcs_name[0] = func_name;
  195. task = starpu_task_create();
  196. task->synchronous = 1;
  197. task->cl = &codelet;
  198. task->cl_arg_free = 1;
  199. starpu_codelet_pack_args(&task->cl_arg, &task->cl_arg_size,
  200. STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]),
  201. STARPU_VALUE, &ffactor, sizeof(ffactor),
  202. 0);
  203. ret = starpu_task_submit(task);
  204. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
  205. starpu_task_wait_for_all();
  206. free(ifactor);
  207. }
  208. void do_test_float_int_pack(starpu_cpu_func_t func, char* func_name)
  209. {
  210. struct starpu_task *task;
  211. struct starpu_codelet codelet;
  212. int ret;
  213. int *ifactor;
  214. float ffactor=FFACTOR;
  215. FPRINTF(stderr, "\nTesting %s\n", __func__);
  216. ifactor = calloc(2048, sizeof(int));
  217. ifactor[0] = IFACTOR;
  218. starpu_codelet_init(&codelet);
  219. codelet.cpu_funcs[0] = func;
  220. codelet.cpu_funcs_name[0] = func_name;
  221. task = starpu_task_create();
  222. task->synchronous = 1;
  223. task->cl = &codelet;
  224. task->cl_arg_free = 1;
  225. starpu_codelet_pack_args(&task->cl_arg, &task->cl_arg_size,
  226. STARPU_VALUE, &ffactor, sizeof(ffactor),
  227. STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]),
  228. 0);
  229. ret = starpu_task_submit(task);
  230. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
  231. starpu_task_wait_for_all();
  232. free(ifactor);
  233. }
  234. int main(int argc, char **argv)
  235. {
  236. int ret;
  237. (void) argc;
  238. (void) argv;
  239. ret = starpu_init(NULL);
  240. if (ret == -ENODEV) return STARPU_TEST_SKIPPED;
  241. STARPU_CHECK_RETURN_VALUE(ret, "starpu_init");
  242. if (starpu_worker_get_count_by_type(STARPU_CPU_WORKER) == 0)
  243. goto enodev;
  244. do_test_int_float_task_insert(func_cpu_int_float, "func_cpu_int_float");
  245. do_test_int_float_task_insert(func_cpu_int_float_multiple_unpack, "func_cpu_int_float_multiple_unpack");
  246. do_test_int_float_task_insert(func_cpu_int_float_unpack_copyleft, "func_cpu_int_float_unpack_copyleft");
  247. do_test_int_float_task_insert_pack(func_cpu_int_float, "func_cpu_int_float");
  248. do_test_int_float_task_insert_pack(func_cpu_int_float_multiple_unpack, "func_cpu_int_float_multiple_unpack");
  249. do_test_int_float_task_insert_pack(func_cpu_int_float_unpack_copyleft, "func_cpu_int_float_unpack_copyleft");
  250. do_test_float_int_task_insert(func_cpu_float_int, "func_cpu_float_int");
  251. do_test_float_int_task_insert(func_cpu_float_int_multiple_unpack, "func_cpu_float_int_multiple_unpack");
  252. do_test_float_int_task_insert(func_cpu_float_int_unpack_copyleft, "func_cpu_float_int_unpack_copyleft");
  253. do_test_float_int_task_insert_pack(func_cpu_float_int, "func_cpu_float_int");
  254. do_test_float_int_task_insert_pack(func_cpu_float_int_multiple_unpack, "func_cpu_float_int_multiple_unpack");
  255. do_test_float_int_task_insert_pack(func_cpu_float_int_unpack_copyleft, "func_cpu_float_int_unpack_copyleft");
  256. do_test_int_float_pack(func_cpu_int_float, "func_cpu_int_float");
  257. do_test_int_float_pack(func_cpu_int_float_multiple_unpack, "func_cpu_int_float_multiple_unpack");
  258. do_test_int_float_pack(func_cpu_int_float_unpack_copyleft, "func_cpu_int_float_unpack_copyleft");
  259. do_test_float_int_pack(func_cpu_float_int, "func_cpu_float_int");
  260. do_test_float_int_pack(func_cpu_float_int_multiple_unpack, "func_cpu_float_int_multiple_unpack");
  261. do_test_float_int_pack(func_cpu_float_int_unpack_copyleft, "func_cpu_float_int_unpack_copyleft");
  262. starpu_shutdown();
  263. return 0;
  264. enodev:
  265. starpu_shutdown();
  266. fprintf(stderr, "WARNING: No one can execute this task\n");
  267. /* yes, we do not perform the computation but we did detect that no one
  268. * could perform the kernel, so this is not an error from StarPU */
  269. return STARPU_TEST_SKIPPED;
  270. }