insert_task_value.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. /* StarPU --- Runtime system for heterogeneous multicore architectures.
  2. *
  3. * Copyright (C) 2015, 2016 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, NULL);
  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. char buffer[1024];
  48. (void) descr;
  49. starpu_codelet_unpack_args_and_copyleft(_args, buffer, 1024, ifactor, NULL);
  50. starpu_codelet_unpack_args(buffer, &ffactor);
  51. FPRINTF(stderr, "[func_cpu_int_float_unpack_copyleft] Values %d - %3.2f\n", ifactor[0], ffactor);
  52. assert(ifactor[0] == IFACTOR && ffactor == FFACTOR);
  53. }
  54. void func_cpu_float_int(void *descr[], void *_args)
  55. {
  56. int ifactor[2048];
  57. float ffactor;
  58. (void) descr;
  59. starpu_codelet_unpack_args(_args, &ffactor, ifactor);
  60. FPRINTF(stderr, "[func_cpu_float_int ] Values %d - %3.2f\n", ifactor[0], ffactor);
  61. assert(ifactor[0] == IFACTOR && ffactor == FFACTOR);
  62. }
  63. void func_cpu_float_int_multiple_unpack(void *descr[], void *_args)
  64. {
  65. int ifactor[2048];
  66. float ffactor;
  67. (void) descr;
  68. starpu_codelet_unpack_args(_args, &ffactor, NULL);
  69. starpu_codelet_unpack_args(_args, &ffactor, ifactor);
  70. FPRINTF(stderr, "[func_cpu_float_int_multiple_unpack] Values %d - %3.2f\n", ifactor[0], ffactor);
  71. assert(ifactor[0] == IFACTOR && ffactor == FFACTOR);
  72. }
  73. void func_cpu_float_int_unpack_copyleft(void *descr[], void *_args)
  74. {
  75. int ifactor[2048];
  76. float ffactor;
  77. char buffer[10240];
  78. (void) descr;
  79. starpu_codelet_unpack_args_and_copyleft(_args, buffer, 1024, &ffactor, NULL);
  80. starpu_codelet_unpack_args(buffer, ifactor);
  81. FPRINTF(stderr, "[func_cpu_float_int_multiple_unpack] Values %d - %3.2f\n", ifactor[0], ffactor);
  82. assert(ifactor[0] == IFACTOR && ffactor == FFACTOR);
  83. }
  84. int do_test_int_float_task_insert(starpu_cpu_func_t func, char* func_name)
  85. {
  86. int ifactor[2048];
  87. float ffactor=FFACTOR;
  88. int ret;
  89. struct starpu_codelet codelet;
  90. starpu_codelet_init(&codelet);
  91. codelet.cpu_funcs[0] = func;
  92. codelet.cpu_funcs_name[0] = func_name;
  93. ifactor[0] = IFACTOR;
  94. ret = starpu_task_insert(&codelet,
  95. STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]),
  96. STARPU_VALUE, &ffactor, sizeof(ffactor),
  97. 0);
  98. if (ret == -ENODEV) return ret;
  99. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
  100. starpu_task_wait_for_all();
  101. return 0;
  102. }
  103. int do_test_int_float_task_insert_pack(starpu_cpu_func_t func, char* func_name)
  104. {
  105. int ifactor[2048];
  106. float ffactor=FFACTOR;
  107. int ret;
  108. struct starpu_codelet codelet;
  109. void *cl_arg = NULL;
  110. size_t cl_arg_size = 0;
  111. ifactor[0] = IFACTOR;
  112. starpu_codelet_pack_args(&cl_arg, &cl_arg_size,
  113. STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]),
  114. STARPU_VALUE, &ffactor, sizeof(ffactor),
  115. 0);
  116. starpu_codelet_init(&codelet);
  117. codelet.cpu_funcs[0] = func;
  118. codelet.cpu_funcs_name[0] = func_name;
  119. ret = starpu_task_insert(&codelet,
  120. STARPU_CL_ARGS, cl_arg, cl_arg_size,
  121. 0);
  122. if (ret == -ENODEV) return ret;
  123. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
  124. starpu_task_wait_for_all();
  125. return 0;
  126. }
  127. int do_test_float_int_task_insert(starpu_cpu_func_t func, char* func_name)
  128. {
  129. int ifactor[2048];
  130. float ffactor=FFACTOR;
  131. int ret;
  132. struct starpu_codelet codelet;
  133. starpu_codelet_init(&codelet);
  134. codelet.cpu_funcs[0] = func;
  135. codelet.cpu_funcs_name[0] = func_name;
  136. ifactor[0] = IFACTOR;
  137. ret = starpu_task_insert(&codelet,
  138. STARPU_VALUE, &ffactor, sizeof(ffactor),
  139. STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]),
  140. 0);
  141. if (ret == -ENODEV) return ret;
  142. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
  143. starpu_task_wait_for_all();
  144. return 0;
  145. }
  146. int do_test_float_int_task_insert_pack(starpu_cpu_func_t func, char* func_name)
  147. {
  148. int ifactor[2048];
  149. float ffactor=FFACTOR;
  150. int ret;
  151. struct starpu_codelet codelet;
  152. void *cl_arg = NULL;
  153. size_t cl_arg_size = 0;
  154. ifactor[0] = IFACTOR;
  155. starpu_codelet_pack_args(&cl_arg, &cl_arg_size,
  156. STARPU_VALUE, &ffactor, sizeof(ffactor),
  157. STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]),
  158. 0);
  159. starpu_codelet_init(&codelet);
  160. codelet.cpu_funcs[0] = func;
  161. codelet.cpu_funcs_name[0] = func_name;
  162. ret = starpu_task_insert(&codelet,
  163. STARPU_CL_ARGS, cl_arg, cl_arg_size,
  164. 0);
  165. if (ret == -ENODEV) return ret;
  166. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_insert");
  167. starpu_task_wait_for_all();
  168. return 0;
  169. }
  170. int do_test_int_float_pack(starpu_cpu_func_t func, char* func_name)
  171. {
  172. struct starpu_task *task;
  173. struct starpu_codelet codelet;
  174. int ret;
  175. int ifactor[2048];
  176. float ffactor=FFACTOR;
  177. starpu_codelet_init(&codelet);
  178. codelet.cpu_funcs[0] = func;
  179. codelet.cpu_funcs_name[0] = func_name;
  180. task = starpu_task_create();
  181. task->synchronous = 1;
  182. task->cl = &codelet;
  183. task->cl_arg_free = 1;
  184. starpu_codelet_pack_args(&task->cl_arg, &task->cl_arg_size,
  185. STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]),
  186. STARPU_VALUE, &ffactor, sizeof(ffactor),
  187. 0);
  188. ret = starpu_task_submit(task);
  189. if (ret == -ENODEV) return ret;
  190. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
  191. starpu_task_wait_for_all();
  192. return 0;
  193. }
  194. int do_test_float_int_pack(starpu_cpu_func_t func, char* func_name)
  195. {
  196. struct starpu_task *task;
  197. struct starpu_codelet codelet;
  198. int ret;
  199. int ifactor[2048];
  200. float ffactor=FFACTOR;
  201. starpu_codelet_init(&codelet);
  202. codelet.cpu_funcs[0] = func;
  203. codelet.cpu_funcs_name[0] = func_name;
  204. task = starpu_task_create();
  205. task->synchronous = 1;
  206. task->cl = &codelet;
  207. task->cl_arg_free = 1;
  208. starpu_codelet_pack_args(&task->cl_arg, &task->cl_arg_size,
  209. STARPU_VALUE, &ffactor, sizeof(ffactor),
  210. STARPU_VALUE, ifactor, 2048*sizeof(ifactor[0]),
  211. 0);
  212. ret = starpu_task_submit(task);
  213. if (ret == -ENODEV) return ret;
  214. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
  215. starpu_task_wait_for_all();
  216. return 0;
  217. }
  218. int main(int argc, char **argv)
  219. {
  220. int ret;
  221. (void) argc;
  222. (void) argv;
  223. ret = starpu_init(NULL);
  224. if (ret == -ENODEV) return STARPU_TEST_SKIPPED;
  225. STARPU_CHECK_RETURN_VALUE(ret, "starpu_init");
  226. ret = do_test_int_float_task_insert(func_cpu_int_float, "func_cpu_int_float_name");
  227. if (ret == -ENODEV) goto enodev;
  228. ret = do_test_int_float_task_insert(func_cpu_int_float_multiple_unpack, "func_cpu_int_float_multiple_unpack");
  229. if (ret == -ENODEV) goto enodev;
  230. ret = do_test_int_float_task_insert(func_cpu_int_float_unpack_copyleft, "func_cpu_int_float_unpack_copyleft");
  231. if (ret == -ENODEV) goto enodev;
  232. ret = do_test_int_float_task_insert_pack(func_cpu_int_float, "func_cpu_int_float_name");
  233. if (ret == -ENODEV) goto enodev;
  234. ret = do_test_int_float_task_insert_pack(func_cpu_int_float_multiple_unpack, "func_cpu_int_float_multiple_unpack");
  235. if (ret == -ENODEV) goto enodev;
  236. ret = do_test_int_float_task_insert_pack(func_cpu_int_float_unpack_copyleft, "func_cpu_int_float_unpack_copyleft");
  237. if (ret == -ENODEV) goto enodev;
  238. ret = do_test_float_int_task_insert(func_cpu_float_int, "func_cpu_float_int");
  239. if (ret == -ENODEV) goto enodev;
  240. ret = do_test_float_int_task_insert(func_cpu_float_int_multiple_unpack, "func_cpu_float_int_multiple_unpack");
  241. if (ret == -ENODEV) goto enodev;
  242. ret = do_test_float_int_task_insert(func_cpu_float_int_unpack_copyleft, "func_cpu_float_int_unpack_copyleft");
  243. if (ret == -ENODEV) goto enodev;
  244. ret = do_test_float_int_task_insert_pack(func_cpu_float_int, "func_cpu_float_int");
  245. if (ret == -ENODEV) goto enodev;
  246. ret = do_test_float_int_task_insert_pack(func_cpu_float_int_multiple_unpack, "func_cpu_float_int_multiple_unpack");
  247. if (ret == -ENODEV) goto enodev;
  248. ret = do_test_float_int_task_insert_pack(func_cpu_float_int_unpack_copyleft, "func_cpu_float_int_unpack_copyleft");
  249. if (ret == -ENODEV) goto enodev;
  250. ret = do_test_int_float_pack(func_cpu_int_float, "func_cpu_int_float_name");
  251. if (ret == -ENODEV) goto enodev;
  252. ret = do_test_int_float_pack(func_cpu_int_float_multiple_unpack, "func_cpu_int_float_multiple_unpack");
  253. if (ret == -ENODEV) goto enodev;
  254. ret = do_test_int_float_pack(func_cpu_int_float_unpack_copyleft, "func_cpu_int_float_unpack_copyleft");
  255. if (ret == -ENODEV) goto enodev;
  256. ret = do_test_float_int_pack(func_cpu_float_int, "func_cpu_float_int");
  257. if (ret == -ENODEV) goto enodev;
  258. ret = do_test_float_int_pack(func_cpu_float_int_multiple_unpack, "func_cpu_float_int_multiple_unpack");
  259. if (ret == -ENODEV) goto enodev;
  260. ret = do_test_float_int_pack(func_cpu_float_int_unpack_copyleft, "func_cpu_float_int_unpack_copyleft");
  261. if (ret == -ENODEV) goto enodev;
  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. }