fstarpu.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. /* StarPU --- Runtime system for heterogeneous multicore architectures.
  2. *
  3. * Copyright (C) 2016-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
  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 <stdlib.h>
  17. #include <stdio.h>
  18. #include <string.h>
  19. #include <starpu.h>
  20. #include <common/utils.h>
  21. typedef void (*_starpu_callback_func_t)(void *);
  22. static const intptr_t fstarpu_r = STARPU_R;
  23. static const intptr_t fstarpu_w = STARPU_W;
  24. static const intptr_t fstarpu_rw = STARPU_RW;
  25. static const intptr_t fstarpu_scratch = STARPU_SCRATCH;
  26. static const intptr_t fstarpu_redux = STARPU_REDUX;
  27. static const intptr_t fstarpu_mpi_redux = STARPU_MPI_REDUX;
  28. static const intptr_t fstarpu_commute = STARPU_COMMUTE;
  29. static const intptr_t fstarpu_ssend = STARPU_SSEND;
  30. static const intptr_t fstarpu_locality = STARPU_LOCALITY;
  31. static const intptr_t fstarpu_data_array = STARPU_DATA_ARRAY;
  32. static const intptr_t fstarpu_data_mode_array = STARPU_DATA_MODE_ARRAY;
  33. static const intptr_t fstarpu_cl_args = STARPU_CL_ARGS;
  34. static const intptr_t fstarpu_cl_args_nfree = STARPU_CL_ARGS_NFREE;
  35. static const intptr_t fstarpu_task_deps_array = STARPU_TASK_DEPS_ARRAY;
  36. static const intptr_t fstarpu_task_end_deps_array = STARPU_TASK_END_DEPS_ARRAY;
  37. static const intptr_t fstarpu_callback = STARPU_CALLBACK;
  38. static const intptr_t fstarpu_callback_with_arg = STARPU_CALLBACK_WITH_ARG;
  39. static const intptr_t fstarpu_callback_with_arg_nfree = STARPU_CALLBACK_WITH_ARG_NFREE;
  40. static const intptr_t fstarpu_callback_arg = STARPU_CALLBACK_ARG;
  41. static const intptr_t fstarpu_callback_arg_nfree= STARPU_CALLBACK_ARG_NFREE;
  42. static const intptr_t fstarpu_prologue_callback = STARPU_PROLOGUE_CALLBACK;
  43. static const intptr_t fstarpu_prologue_callback_arg = STARPU_PROLOGUE_CALLBACK_ARG;
  44. static const intptr_t fstarpu_prologue_callback_arg_nfree = STARPU_PROLOGUE_CALLBACK_ARG_NFREE;
  45. static const intptr_t fstarpu_prologue_callback_pop = STARPU_PROLOGUE_CALLBACK_POP;
  46. static const intptr_t fstarpu_prologue_callback_pop_arg = STARPU_PROLOGUE_CALLBACK_POP_ARG;
  47. static const intptr_t fstarpu_prologue_callback_pop_arg_nfree = STARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE;
  48. static const intptr_t fstarpu_priority = STARPU_PRIORITY;
  49. static const intptr_t fstarpu_execute_on_node = STARPU_EXECUTE_ON_NODE;
  50. static const intptr_t fstarpu_execute_on_data = STARPU_EXECUTE_ON_DATA;
  51. static const intptr_t fstarpu_execute_where = STARPU_EXECUTE_WHERE;
  52. static const intptr_t fstarpu_execute_on_worker = STARPU_EXECUTE_ON_WORKER;
  53. static const intptr_t fstarpu_worker_order = STARPU_WORKER_ORDER;
  54. static const intptr_t fstarpu_hypervisor_tag = STARPU_HYPERVISOR_TAG;
  55. static const intptr_t fstarpu_possibly_parallel = STARPU_POSSIBLY_PARALLEL;
  56. static const intptr_t fstarpu_flops = STARPU_FLOPS;
  57. static const intptr_t fstarpu_tag = STARPU_TAG;
  58. static const intptr_t fstarpu_tag_only = STARPU_TAG_ONLY;
  59. static const intptr_t fstarpu_name = STARPU_NAME;
  60. static const intptr_t fstarpu_task_color = STARPU_TASK_COLOR;
  61. static const intptr_t fstarpu_handles_sequential_consistency = STARPU_HANDLES_SEQUENTIAL_CONSISTENCY;
  62. static const intptr_t fstarpu_task_end_dep = STARPU_TASK_END_DEP;
  63. static const intptr_t fstarpu_task_synchronous = STARPU_TASK_SYNCHRONOUS;
  64. static const intptr_t fstarpu_node_selection_policy = STARPU_NODE_SELECTION_POLICY;
  65. static const intptr_t fstarpu_task_workerids = STARPU_TASK_WORKERIDS;
  66. static const intptr_t fstarpu_sequential_consistency = STARPU_SEQUENTIAL_CONSISTENCY;
  67. static const intptr_t fstarpu_task_profiling_info = STARPU_TASK_PROFILING_INFO;
  68. static const intptr_t fstarpu_task_no_submitorder = STARPU_TASK_NO_SUBMITORDER;
  69. static const intptr_t fstarpu_task_sched_data = STARPU_TASK_SCHED_DATA;
  70. static const intptr_t fstarpu_task_file = STARPU_TASK_FILE;
  71. static const intptr_t fstarpu_task_line = STARPU_TASK_LINE;
  72. static const intptr_t fstarpu_value = STARPU_VALUE;
  73. static const intptr_t fstarpu_sched_ctx = STARPU_SCHED_CTX;
  74. static const intptr_t fstarpu_cpu_worker = STARPU_CPU_WORKER;
  75. static const intptr_t fstarpu_cuda_worker = STARPU_CUDA_WORKER;
  76. static const intptr_t fstarpu_opencl_worker = STARPU_OPENCL_WORKER;
  77. static const intptr_t fstarpu_any_worker = STARPU_ANY_WORKER;
  78. static const intptr_t fstarpu_narch = STARPU_NARCH;
  79. static const intptr_t fstarpu_nmaxbufs = STARPU_NMAXBUFS;
  80. static const intptr_t fstarpu_sched_ctx_policy_name = STARPU_SCHED_CTX_POLICY_NAME;
  81. static const intptr_t fstarpu_sched_ctx_policy_struct = STARPU_SCHED_CTX_POLICY_STRUCT;
  82. static const intptr_t fstarpu_sched_ctx_policy_min_prio = STARPU_SCHED_CTX_POLICY_MIN_PRIO;
  83. static const intptr_t fstarpu_sched_ctx_policy_max_prio = STARPU_SCHED_CTX_POLICY_MAX_PRIO;
  84. static const intptr_t fstarpu_sched_ctx_hierarchy_level = STARPU_SCHED_CTX_HIERARCHY_LEVEL;
  85. static const intptr_t fstarpu_sched_ctx_nested = STARPU_SCHED_CTX_NESTED;
  86. static const intptr_t fstarpu_sched_ctx_awake_workers = STARPU_SCHED_CTX_AWAKE_WORKERS;
  87. static const intptr_t fstarpu_sched_ctx_policy_init = STARPU_SCHED_CTX_POLICY_INIT;
  88. static const intptr_t fstarpu_sched_ctx_user_data = STARPU_SCHED_CTX_USER_DATA;
  89. static const intptr_t fstarpu_starpu_nowhere = STARPU_NOWHERE;
  90. static const intptr_t fstarpu_starpu_cpu = STARPU_CPU;
  91. static const intptr_t fstarpu_starpu_cuda = STARPU_CUDA;
  92. static const intptr_t fstarpu_starpu_opencl = STARPU_OPENCL;
  93. static const intptr_t fstarpu_starpu_codelet_simgrid_execute = STARPU_CODELET_SIMGRID_EXECUTE;
  94. static const intptr_t fstarpu_starpu_codelet_simgrid_execute_and_inject = STARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT;
  95. static const intptr_t fstarpu_starpu_cuda_async = STARPU_CUDA_ASYNC;
  96. static const intptr_t fstarpu_starpu_opencl_async = STARPU_OPENCL_ASYNC;
  97. //static const intptr_t fstarpu_per_worker = STARPU_PER_WORKER;
  98. //static const intptr_t fstarpu_per_arch = STARPU_PER_ARCH;
  99. //static const intptr_t fstarpu_per_common = STARPU_COMMON;
  100. static const intptr_t fstarpu_history_based = STARPU_HISTORY_BASED;
  101. static const intptr_t fstarpu_regression_based = STARPU_REGRESSION_BASED;
  102. static const intptr_t fstarpu_nl_regression_based = STARPU_NL_REGRESSION_BASED;
  103. static const intptr_t fstarpu_multiple_regression_based = STARPU_MULTIPLE_REGRESSION_BASED;
  104. static const intptr_t fstarpu_seq = STARPU_SEQ;
  105. static const intptr_t fstarpu_spmd = STARPU_SPMD;
  106. static const intptr_t fstarpu_forkjoin = STARPU_FORKJOIN;
  107. intptr_t fstarpu_get_constant(char *s)
  108. {
  109. if (!strcmp(s, "FSTARPU_R")) { return fstarpu_r; }
  110. else if (!strcmp(s, "FSTARPU_W")) { return fstarpu_w; }
  111. else if (!strcmp(s, "FSTARPU_RW")) { return fstarpu_rw; }
  112. else if (!strcmp(s, "FSTARPU_SCRATCH")) { return fstarpu_scratch; }
  113. else if (!strcmp(s, "FSTARPU_REDUX")) { return fstarpu_redux; }
  114. else if (!strcmp(s, "FSTARPU_MPI_REDUX")) { return fstarpu_mpi_redux; }
  115. else if (!strcmp(s, "FSTARPU_COMMUTE")) { return fstarpu_commute; }
  116. else if (!strcmp(s, "FSTARPU_SSEND")) { return fstarpu_ssend; }
  117. else if (!strcmp(s, "FSTARPU_LOCALITY")) { return fstarpu_locality; }
  118. else if (!strcmp(s, "FSTARPU_DATA_ARRAY")) { return fstarpu_data_array; }
  119. else if (!strcmp(s, "FSTARPU_DATA_MODE_ARRAY")) { return fstarpu_data_mode_array; }
  120. else if (!strcmp(s, "FSTARPU_CL_ARGS")) { return fstarpu_cl_args; }
  121. else if (!strcmp(s, "FSTARPU_CL_ARGS_NFREE")) { return fstarpu_cl_args_nfree; }
  122. else if (!strcmp(s, "FSTARPU_TASK_DEPS_ARRAY")) { return fstarpu_task_deps_array; }
  123. else if (!strcmp(s, "FSTARPU_TASK_END_DEPS_ARRAY")) { return fstarpu_task_end_deps_array; }
  124. else if (!strcmp(s, "FSTARPU_CALLBACK")) { return fstarpu_callback; }
  125. else if (!strcmp(s, "FSTARPU_CALLBACK_WITH_ARG")) { return fstarpu_callback_with_arg; }
  126. else if (!strcmp(s, "FSTARPU_CALLBACK_WITH_ARG_NFREE")) { return fstarpu_callback_with_arg_nfree; }
  127. else if (!strcmp(s, "FSTARPU_CALLBACK_ARG")) { return fstarpu_callback_arg; }
  128. else if (!strcmp(s, "FSTARPU_CALLBACK_ARG_NFREE")) { return fstarpu_callback_arg_nfree; }
  129. else if (!strcmp(s, "FSTARPU_PROLOGUE_CALLBACK")) { return fstarpu_prologue_callback; }
  130. else if (!strcmp(s, "FSTARPU_PROLOGUE_CALLBACK_ARG")) { return fstarpu_prologue_callback_arg; }
  131. else if (!strcmp(s, "FSTARPU_PROLOGUE_CALLBACK_ARG_NFREE")) { return fstarpu_prologue_callback_arg_nfree; }
  132. else if (!strcmp(s, "FSTARPU_PROLOGUE_CALLBACK_POP")) { return fstarpu_prologue_callback_pop; }
  133. else if (!strcmp(s, "FSTARPU_PROLOGUE_CALLBACK_POP_ARG")) { return fstarpu_prologue_callback_pop_arg; }
  134. else if (!strcmp(s, "FSTARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE")) { return fstarpu_prologue_callback_pop_arg_nfree; }
  135. else if (!strcmp(s, "FSTARPU_PRIORITY")) { return fstarpu_priority; }
  136. else if (!strcmp(s, "FSTARPU_EXECUTE_ON_NODE")) { return fstarpu_execute_on_node; }
  137. else if (!strcmp(s, "FSTARPU_EXECUTE_ON_DATA")) { return fstarpu_execute_on_data; }
  138. else if (!strcmp(s, "FSTARPU_EXECUTE_WHERE")) { return fstarpu_execute_where; }
  139. else if (!strcmp(s, "FSTARPU_EXECUTE_ON_WORKER")) { return fstarpu_execute_on_worker; }
  140. else if (!strcmp(s, "FSTARPU_WORKER_ORDER")) { return fstarpu_worker_order; }
  141. else if (!strcmp(s, "FSTARPU_HYPERVISOR_TAG")) { return fstarpu_hypervisor_tag; }
  142. else if (!strcmp(s, "FSTARPU_POSSIBLY_PARALLEL")) { return fstarpu_possibly_parallel; }
  143. else if (!strcmp(s, "FSTARPU_FLOPS")) { return fstarpu_flops; }
  144. else if (!strcmp(s, "FSTARPU_TAG")) { return fstarpu_tag; }
  145. else if (!strcmp(s, "FSTARPU_TAG_ONLY")) { return fstarpu_tag_only; }
  146. else if (!strcmp(s, "FSTARPU_NAME")) { return fstarpu_name; }
  147. else if (!strcmp(s, "FSTARPU_NODE_SELECTION_POLICY")) { return fstarpu_node_selection_policy; }
  148. else if (!strcmp(s, "FSTARPU_VALUE")) { return fstarpu_value; }
  149. else if (!strcmp(s, "FSTARPU_SCHED_CTX")) { return fstarpu_sched_ctx; }
  150. else if (!strcmp(s, "FSTARPU_TASK_COLOR")) { return fstarpu_task_color; }
  151. else if (!strcmp(s, "FSTARPU_HANDLES_SEQUENTIAL_CONSISTENCY")) { return fstarpu_handles_sequential_consistency; }
  152. else if (!strcmp(s, "FSTARPU_TASK_END_DEP")) { return fstarpu_task_end_dep; }
  153. else if (!strcmp(s, "FSTARPU_TASK_WORKERIDS")) { return fstarpu_task_workerids; }
  154. else if (!strcmp(s, "FSTARPU_TASK_SYNCHRONOUS")) { return fstarpu_task_synchronous; }
  155. else if (!strcmp(s, "FSTARPU_SEQUENTIAL_CONSISTENCY")) { return fstarpu_sequential_consistency; }
  156. else if (!strcmp(s, "FSTARPU_TASK_PROFILING_INFO")) { return fstarpu_task_profiling_info; }
  157. else if (!strcmp(s, "FSTARPU_TASK_NO_SUBMITORDER")) { return fstarpu_task_no_submitorder; }
  158. else if (!strcmp(s, "FSTARPU_TASK_SCHED_DATA")) { return fstarpu_task_sched_data; }
  159. else if (!strcmp(s, "FSTARPU_TASK_FILE")) { return fstarpu_task_file; }
  160. else if (!strcmp(s, "FSTARPU_TASK_LINE")) { return fstarpu_task_line; }
  161. else if (!strcmp(s, "FSTARPU_CPU_WORKER")) { return fstarpu_cpu_worker; }
  162. else if (!strcmp(s, "FSTARPU_CUDA_WORKER")) { return fstarpu_cuda_worker; }
  163. else if (!strcmp(s, "FSTARPU_OPENCL_WORKER")) { return fstarpu_opencl_worker; }
  164. else if (!strcmp(s, "FSTARPU_ANY_WORKER")) { return fstarpu_any_worker; }
  165. else if (!strcmp(s, "FSTARPU_NARCH")) { return fstarpu_narch; }
  166. else if (!strcmp(s, "FSTARPU_NMAXBUFS")) { return fstarpu_nmaxbufs; }
  167. else if (!strcmp(s, "FSTARPU_SCHED_CTX_POLICY_NAME")) { return fstarpu_sched_ctx_policy_name; }
  168. else if (!strcmp(s, "FSTARPU_SCHED_CTX_POLICY_STRUCT")) { return fstarpu_sched_ctx_policy_struct; }
  169. else if (!strcmp(s, "FSTARPU_SCHED_CTX_POLICY_MIN_PRIO")) { return fstarpu_sched_ctx_policy_min_prio; }
  170. else if (!strcmp(s, "FSTARPU_SCHED_CTX_POLICY_MAX_PRIO")) { return fstarpu_sched_ctx_policy_max_prio; }
  171. else if (!strcmp(s, "FSTARPU_SCHED_CTX_HIERARCHY_LEVEL")) { return fstarpu_sched_ctx_hierarchy_level; }
  172. else if (!strcmp(s, "FSTARPU_SCHED_CTX_NESTED")) { return fstarpu_sched_ctx_nested; }
  173. else if (!strcmp(s, "FSTARPU_SCHED_CTX_AWAKE_WORKERS")) { return fstarpu_sched_ctx_awake_workers; }
  174. else if (!strcmp(s, "FSTARPU_SCHED_CTX_POLICY_INIT")) { return fstarpu_sched_ctx_policy_init; }
  175. else if (!strcmp(s, "FSTARPU_SCHED_CTX_USER_DATA")) { return fstarpu_sched_ctx_user_data; }
  176. else if (!strcmp(s, "FSTARPU_NOWHERE")) { return fstarpu_starpu_nowhere; }
  177. else if (!strcmp(s, "FSTARPU_CPU")) { return fstarpu_starpu_cpu; }
  178. else if (!strcmp(s, "FSTARPU_CUDA")) { return fstarpu_starpu_cuda; }
  179. else if (!strcmp(s, "FSTARPU_OPENCL")) { return fstarpu_starpu_opencl; }
  180. else if (!strcmp(s, "FSTARPU_CODELET_SIMGRID_EXECUTE")) { return fstarpu_starpu_codelet_simgrid_execute; }
  181. else if (!strcmp(s, "FSTARPU_CODELET_SIMGRID_EXECUTE_AND_INJECT")) { return fstarpu_starpu_codelet_simgrid_execute_and_inject; }
  182. else if (!strcmp(s, "FSTARPU_CUDA_ASYNC")) { return fstarpu_starpu_cuda_async; }
  183. else if (!strcmp(s, "FSTARPU_OPENCL_ASYNC")) { return fstarpu_starpu_opencl_async; }
  184. // else if (!strcmp(s, "FSTARPU_PER_WORKER")) { return fstarpu_per_worker; }
  185. // else if (!strcmp(s, "FSTARPU_PER_ARCH")) { return fstarpu_per_arch; }
  186. // else if (!strcmp(s, "FSTARPU_COMMON")) { return fstarpu_per_common; }
  187. else if (!strcmp(s, "FSTARPU_HISTORY_BASED")) { return fstarpu_history_based; }
  188. else if (!strcmp(s, "FSTARPU_REGRESSION_BASED")) { return fstarpu_regression_based; }
  189. else if (!strcmp(s, "FSTARPU_NL_REGRESSION_BASED")) { return fstarpu_nl_regression_based; }
  190. else if (!strcmp(s, "FSTARPU_MULTIPLE_REGRESSION_BASED")) { return fstarpu_multiple_regression_based; }
  191. else if (!strcmp(s, "FSTARPU_SEQ")) { return fstarpu_seq; }
  192. else if (!strcmp(s, "FSTARPU_SPMD")) { return fstarpu_spmd; }
  193. else if (!strcmp(s, "FSTARPU_FORKJOIN")) { return fstarpu_forkjoin; }
  194. else { _STARPU_ERROR("unknown constant"); }
  195. }
  196. STARPU_ATTRIBUTE_MALLOC
  197. struct starpu_conf *fstarpu_conf_allocate(void)
  198. {
  199. struct starpu_conf *conf;
  200. _STARPU_MALLOC(conf, sizeof(*conf));
  201. starpu_conf_init(conf);
  202. return conf;
  203. }
  204. void fstarpu_conf_free(struct starpu_conf *conf)
  205. {
  206. memset(conf, 0, sizeof(*conf));
  207. free(conf);
  208. }
  209. void fstarpu_conf_set_sched_policy_name(struct starpu_conf *conf, const char *sched_policy_name)
  210. {
  211. conf->sched_policy_name = sched_policy_name;
  212. }
  213. void fstarpu_conf_set_min_prio(struct starpu_conf *conf, int min_prio)
  214. {
  215. conf->global_sched_ctx_min_priority = min_prio;
  216. }
  217. void fstarpu_conf_set_max_prio(struct starpu_conf *conf, int max_prio)
  218. {
  219. conf->global_sched_ctx_max_priority = max_prio;
  220. }
  221. void fstarpu_conf_set_ncpu(struct starpu_conf *conf, int ncpu)
  222. {
  223. STARPU_ASSERT(ncpu >= 0 && ncpu <= STARPU_NMAXWORKERS);
  224. conf->ncpus = ncpu;
  225. }
  226. void fstarpu_conf_set_ncuda(struct starpu_conf *conf, int ncuda)
  227. {
  228. STARPU_ASSERT(ncuda >= 0 && ncuda <= STARPU_NMAXWORKERS);
  229. conf->ncuda = ncuda;
  230. }
  231. void fstarpu_conf_set_nopencl(struct starpu_conf *conf, int nopencl)
  232. {
  233. STARPU_ASSERT(nopencl >= 0 && nopencl <= STARPU_NMAXWORKERS);
  234. conf->nopencl = nopencl;
  235. }
  236. void fstarpu_conf_set_calibrate(struct starpu_conf *conf, int calibrate)
  237. {
  238. STARPU_ASSERT(calibrate == 0 || calibrate == 1);
  239. conf->calibrate = calibrate;
  240. }
  241. void fstarpu_conf_set_bus_calibrate(struct starpu_conf *conf, int bus_calibrate)
  242. {
  243. STARPU_ASSERT(bus_calibrate == 0 || bus_calibrate == 1);
  244. conf->bus_calibrate = bus_calibrate;
  245. }
  246. void fstarpu_topology_print(void)
  247. {
  248. starpu_topology_print(stderr);
  249. }
  250. STARPU_ATTRIBUTE_MALLOC
  251. struct starpu_codelet *fstarpu_codelet_allocate(void)
  252. {
  253. struct starpu_codelet *cl;
  254. _STARPU_MALLOC(cl, sizeof(*cl));
  255. starpu_codelet_init(cl);
  256. return cl;
  257. }
  258. void fstarpu_codelet_free(struct starpu_codelet *cl)
  259. {
  260. memset(cl, 0, sizeof(*cl));
  261. free(cl);
  262. }
  263. void fstarpu_codelet_set_name(struct starpu_codelet *cl, const char *cl_name)
  264. {
  265. cl->name = cl_name;
  266. }
  267. void fstarpu_codelet_set_model(struct starpu_codelet *cl, struct starpu_perfmodel *cl_perfmodel)
  268. {
  269. cl->model = cl_perfmodel;
  270. }
  271. void fstarpu_codelet_set_energy_model(struct starpu_codelet *cl, struct starpu_perfmodel *cl_perfmodel)
  272. {
  273. cl->energy_model = cl_perfmodel;
  274. }
  275. void fstarpu_codelet_add_cpu_func(struct starpu_codelet *cl, void *f_ptr)
  276. {
  277. const size_t max_cpu_funcs = sizeof(cl->cpu_funcs)/sizeof(cl->cpu_funcs[0])-1;
  278. size_t i;
  279. for (i = 0; i < max_cpu_funcs; i++)
  280. {
  281. if (cl->cpu_funcs[i] == NULL)
  282. {
  283. cl->cpu_funcs[i] = f_ptr;
  284. return;
  285. }
  286. }
  287. _STARPU_ERROR("fstarpu: too many cpu functions in Fortran codelet");
  288. }
  289. void fstarpu_codelet_add_cuda_func(struct starpu_codelet *cl, void *f_ptr)
  290. {
  291. const size_t max_cuda_funcs = sizeof(cl->cuda_funcs)/sizeof(cl->cuda_funcs[0])-1;
  292. unsigned i;
  293. for (i = 0; i < max_cuda_funcs; i++)
  294. {
  295. if (cl->cuda_funcs[i] == NULL)
  296. {
  297. cl->cuda_funcs[i] = f_ptr;
  298. return;
  299. }
  300. }
  301. _STARPU_ERROR("fstarpu: too many cuda functions in Fortran codelet");
  302. }
  303. void fstarpu_codelet_add_cuda_flags(struct starpu_codelet *cl, intptr_t flags)
  304. {
  305. const size_t max_cuda_flags = sizeof(cl->cuda_flags)/sizeof(cl->cuda_flags[0])-1;
  306. unsigned i;
  307. for (i = 0; i < max_cuda_flags; i++)
  308. {
  309. if (cl->cuda_flags[i] == 0)
  310. {
  311. cl->cuda_flags[i] = (char)flags;
  312. return;
  313. }
  314. }
  315. _STARPU_ERROR("fstarpu: too many cuda flags in Fortran codelet");
  316. }
  317. void fstarpu_codelet_add_opencl_func(struct starpu_codelet *cl, void *f_ptr)
  318. {
  319. const size_t max_opencl_funcs = sizeof(cl->opencl_funcs)/sizeof(cl->opencl_funcs[0])-1;
  320. unsigned i;
  321. for (i = 0; i < max_opencl_funcs; i++)
  322. {
  323. if (cl->opencl_funcs[i] == NULL)
  324. {
  325. cl->opencl_funcs[i] = f_ptr;
  326. return;
  327. }
  328. }
  329. _STARPU_ERROR("fstarpu: too many opencl functions in Fortran codelet");
  330. }
  331. void fstarpu_codelet_add_opencl_flags(struct starpu_codelet *cl, intptr_t flags)
  332. {
  333. const size_t max_opencl_flags = sizeof(cl->opencl_flags)/sizeof(cl->opencl_flags[0])-1;
  334. unsigned i;
  335. for (i = 0; i < max_opencl_flags; i++)
  336. {
  337. if (cl->opencl_flags[i] == 0)
  338. {
  339. cl->opencl_flags[i] = (char)flags;
  340. return;
  341. }
  342. }
  343. _STARPU_ERROR("fstarpu: too many opencl flags in Fortran codelet");
  344. }
  345. void fstarpu_codelet_add_buffer(struct starpu_codelet *cl, intptr_t _mode)
  346. {
  347. enum starpu_data_access_mode mode = (enum starpu_data_access_mode) _mode;
  348. const size_t max_modes = sizeof(cl->modes)/sizeof(cl->modes[0])-1;
  349. if ((mode & (STARPU_ACCESS_MODE_MAX-1)) != mode)
  350. {
  351. _STARPU_ERROR("fstarpu: invalid data mode");
  352. }
  353. if (cl->nbuffers < (int) max_modes)
  354. {
  355. cl->modes[cl->nbuffers] = (unsigned int)mode;
  356. cl->nbuffers++;
  357. }
  358. else
  359. {
  360. _STARPU_ERROR("fstarpu: too many buffers in Fortran codelet");
  361. }
  362. }
  363. void fstarpu_codelet_set_variable_nbuffers(struct starpu_codelet *cl)
  364. {
  365. cl->nbuffers = STARPU_VARIABLE_NBUFFERS;
  366. }
  367. void fstarpu_codelet_set_nbuffers(struct starpu_codelet *cl, int nbuffers)
  368. {
  369. if (nbuffers >= 0)
  370. {
  371. cl->nbuffers = nbuffers;
  372. }
  373. else
  374. {
  375. _STARPU_ERROR("fstarpu: invalid nbuffers parameter");
  376. }
  377. }
  378. void fstarpu_codelet_set_flags(struct starpu_codelet *cl, intptr_t flags)
  379. {
  380. cl->flags = (int)flags;
  381. }
  382. void fstarpu_codelet_set_where(struct starpu_codelet *cl, intptr_t where)
  383. {
  384. STARPU_ASSERT(where >= 0);
  385. cl->where = (uint32_t)where;
  386. }
  387. void fstarpu_codelet_set_type(struct starpu_codelet *cl, intptr_t type_constant)
  388. {
  389. STARPU_ASSERT(type_constant == STARPU_SEQ || type_constant == STARPU_SPMD || type_constant == STARPU_FORKJOIN);
  390. cl->type = (int)type_constant;
  391. }
  392. void fstarpu_codelet_set_max_parallelism(struct starpu_codelet *cl, int max_parallelism)
  393. {
  394. if (max_parallelism >= 1)
  395. {
  396. cl->max_parallelism = max_parallelism;
  397. }
  398. else
  399. {
  400. _STARPU_ERROR("fstarpu: invalid max_parallelism parameter");
  401. }
  402. }
  403. STARPU_ATTRIBUTE_MALLOC
  404. struct starpu_perfmodel *fstarpu_perfmodel_allocate(void)
  405. {
  406. struct starpu_perfmodel *model;
  407. _STARPU_CALLOC(model, 1, sizeof(*model));
  408. return model;
  409. }
  410. void fstarpu_perfmodel_free(struct starpu_perfmodel *model)
  411. {
  412. memset(model, 0, sizeof(*model));
  413. free(model);
  414. }
  415. void fstarpu_perfmodel_set_symbol(struct starpu_perfmodel *model, const char *model_symbol)
  416. {
  417. model->symbol = model_symbol;
  418. }
  419. void fstarpu_perfmodel_set_type(struct starpu_perfmodel *model, intptr_t type)
  420. {
  421. STARPU_ASSERT(type == fstarpu_history_based || type == fstarpu_regression_based || type == fstarpu_nl_regression_based || type == fstarpu_multiple_regression_based);
  422. model->type = type;
  423. }
  424. void * fstarpu_variable_get_ptr(void *buffers[], int i)
  425. {
  426. return (void *)STARPU_VARIABLE_GET_PTR(buffers[i]);
  427. }
  428. void * fstarpu_vector_get_ptr(void *buffers[], int i)
  429. {
  430. return (void *)STARPU_VECTOR_GET_PTR(buffers[i]);
  431. }
  432. int fstarpu_vector_get_nx(void *buffers[], int i)
  433. {
  434. return STARPU_VECTOR_GET_NX(buffers[i]);
  435. }
  436. void * fstarpu_matrix_get_ptr(void *buffers[], int i)
  437. {
  438. return (void *)STARPU_MATRIX_GET_PTR(buffers[i]);
  439. }
  440. int fstarpu_matrix_get_ld(void *buffers[], int i)
  441. {
  442. return STARPU_MATRIX_GET_LD(buffers[i]);
  443. }
  444. int fstarpu_matrix_get_nx(void *buffers[], int i)
  445. {
  446. return STARPU_MATRIX_GET_NX(buffers[i]);
  447. }
  448. int fstarpu_matrix_get_ny(void *buffers[], int i)
  449. {
  450. return STARPU_MATRIX_GET_NY(buffers[i]);
  451. }
  452. void * fstarpu_block_get_ptr(void *buffers[], int i)
  453. {
  454. return (void *)STARPU_BLOCK_GET_PTR(buffers[i]);
  455. }
  456. int fstarpu_block_get_ldy(void *buffers[], int i)
  457. {
  458. return STARPU_BLOCK_GET_LDY(buffers[i]);
  459. }
  460. int fstarpu_block_get_ldz(void *buffers[], int i)
  461. {
  462. return STARPU_BLOCK_GET_LDZ(buffers[i]);
  463. }
  464. int fstarpu_block_get_nx(void *buffers[], int i)
  465. {
  466. return STARPU_BLOCK_GET_NX(buffers[i]);
  467. }
  468. int fstarpu_block_get_ny(void *buffers[], int i)
  469. {
  470. return STARPU_BLOCK_GET_NY(buffers[i]);
  471. }
  472. int fstarpu_block_get_nz(void *buffers[], int i)
  473. {
  474. return STARPU_BLOCK_GET_NZ(buffers[i]);
  475. }
  476. void fstarpu_data_acquire(starpu_data_handle_t handle, intptr_t mode)
  477. {
  478. STARPU_ASSERT(mode == fstarpu_r || mode == fstarpu_w || mode == fstarpu_rw);
  479. starpu_data_acquire(handle, (int)mode);
  480. }
  481. void fstarpu_unpack_arg(char *cl_arg, void **buffer_list)
  482. {
  483. size_t current_arg_offset = 0;
  484. int nargs, arg;
  485. /* We fill the different pointers with the appropriate arguments */
  486. memcpy(&nargs, cl_arg, sizeof(nargs));
  487. current_arg_offset += sizeof(nargs);
  488. for (arg = 0; arg < nargs; arg++)
  489. {
  490. void *argptr = buffer_list[arg];
  491. /* If not reading all cl_args */
  492. if(argptr == NULL)
  493. break;
  494. size_t arg_size;
  495. memcpy(&arg_size, cl_arg+current_arg_offset, sizeof(arg_size));
  496. current_arg_offset += sizeof(arg_size);
  497. memcpy(argptr, cl_arg+current_arg_offset, arg_size);
  498. current_arg_offset += arg_size;
  499. }
  500. }
  501. void fstarpu_sched_ctx_display_workers(int ctx)
  502. {
  503. starpu_sched_ctx_display_workers((unsigned)ctx, stderr);
  504. }
  505. intptr_t fstarpu_worker_get_type(int workerid)
  506. {
  507. return (intptr_t)starpu_worker_get_type(workerid);
  508. }
  509. int fstarpu_worker_get_count_by_type(intptr_t type)
  510. {
  511. return starpu_worker_get_count_by_type((enum starpu_worker_archtype)type);
  512. }
  513. unsigned fstarpu_worker_get_ids_by_type(intptr_t type, int *workerids, unsigned maxsize)
  514. {
  515. return starpu_worker_get_ids_by_type((enum starpu_worker_archtype)type, workerids, maxsize);
  516. }
  517. int fstarpu_worker_get_by_type(intptr_t type, int num)
  518. {
  519. return starpu_worker_get_by_type((enum starpu_worker_archtype)type, num);
  520. }
  521. int fstarpu_worker_get_by_devid(intptr_t type, int devid)
  522. {
  523. return starpu_worker_get_by_type((enum starpu_worker_archtype)type, devid);
  524. }
  525. void fstarpu_worker_get_type_as_string(intptr_t type, char *dst, size_t maxlen)
  526. {
  527. const char *str = starpu_worker_get_type_as_string((enum starpu_worker_archtype)type);
  528. snprintf(dst, maxlen, "%s", str);
  529. }
  530. STARPU_ATTRIBUTE_MALLOC
  531. starpu_data_handle_t *fstarpu_data_handle_array_alloc(int nb)
  532. {
  533. void *ptr;
  534. _STARPU_CALLOC(ptr, (size_t)nb, sizeof(starpu_data_handle_t));
  535. return ptr;
  536. }
  537. void fstarpu_data_handle_array_free(starpu_data_handle_t *handles)
  538. {
  539. free(handles);
  540. }
  541. void fstarpu_data_handle_array_set(starpu_data_handle_t *handles, int i, starpu_data_handle_t handle)
  542. {
  543. handles[i] = handle;
  544. }
  545. STARPU_ATTRIBUTE_MALLOC
  546. struct starpu_data_descr *fstarpu_data_descr_array_alloc(int nb)
  547. {
  548. void *ptr;
  549. _STARPU_CALLOC(ptr, (size_t)nb, sizeof(struct starpu_data_descr));
  550. return ptr;
  551. }
  552. STARPU_ATTRIBUTE_MALLOC
  553. struct starpu_data_descr *fstarpu_data_descr_alloc(void)
  554. {
  555. return fstarpu_data_descr_array_alloc(1);
  556. }
  557. void fstarpu_data_descr_array_free(struct starpu_data_descr *descrs)
  558. {
  559. free(descrs);
  560. }
  561. void fstarpu_data_descr_free(struct starpu_data_descr *descr)
  562. {
  563. fstarpu_data_descr_array_free(descr);
  564. }
  565. void fstarpu_data_descr_array_set(struct starpu_data_descr *descrs, int i, starpu_data_handle_t handle, intptr_t mode)
  566. {
  567. descrs[i].handle = handle;
  568. descrs[i].mode = (enum starpu_data_access_mode)mode;
  569. }
  570. void fstarpu_data_descr_set(struct starpu_data_descr *descr, starpu_data_handle_t handle, intptr_t mode)
  571. {
  572. fstarpu_data_descr_array_set(descr, 1, handle, mode);
  573. }
  574. STARPU_ATTRIBUTE_MALLOC
  575. struct starpu_data_filter *fstarpu_data_filter_allocate(void)
  576. {
  577. struct starpu_data_filter *filter;
  578. _STARPU_CALLOC(filter, 1, sizeof(*filter));
  579. return filter;
  580. }
  581. /* Note: use fstarpu_df_alloc_ prefix instead of fstarpu_data_filter_allocate_ to fit within the
  582. * Fortran id length limit */
  583. #define _FSTARPU_DATA_FILTER_ALLOCATOR(name) \
  584. STARPU_ATTRIBUTE_MALLOC \
  585. struct starpu_data_filter *fstarpu_df_alloc_##name(void) \
  586. { \
  587. struct starpu_data_filter *filter = fstarpu_data_filter_allocate(); \
  588. filter->filter_func = starpu_##name; \
  589. return filter; \
  590. }
  591. _FSTARPU_DATA_FILTER_ALLOCATOR(bcsr_filter_canonical_block);
  592. _FSTARPU_DATA_FILTER_ALLOCATOR(csr_filter_vertical_block);
  593. _FSTARPU_DATA_FILTER_ALLOCATOR(matrix_filter_block);
  594. _FSTARPU_DATA_FILTER_ALLOCATOR(matrix_filter_block_shadow);
  595. _FSTARPU_DATA_FILTER_ALLOCATOR(matrix_filter_vertical_block);
  596. _FSTARPU_DATA_FILTER_ALLOCATOR(matrix_filter_vertical_block_shadow);
  597. _FSTARPU_DATA_FILTER_ALLOCATOR(vector_filter_block);
  598. _FSTARPU_DATA_FILTER_ALLOCATOR(vector_filter_block_shadow);
  599. _FSTARPU_DATA_FILTER_ALLOCATOR(vector_filter_list);
  600. _FSTARPU_DATA_FILTER_ALLOCATOR(vector_filter_divide_in_2);
  601. _FSTARPU_DATA_FILTER_ALLOCATOR(block_filter_block);
  602. _FSTARPU_DATA_FILTER_ALLOCATOR(block_filter_block_shadow);
  603. _FSTARPU_DATA_FILTER_ALLOCATOR(block_filter_vertical_block);
  604. _FSTARPU_DATA_FILTER_ALLOCATOR(block_filter_vertical_block_shadow);
  605. #undef _FSTARPU_DATA_FILTER_ALLOCATOR
  606. void fstarpu_data_filter_free(struct starpu_data_filter *filter)
  607. {
  608. memset(filter, 0, sizeof(*filter));
  609. free(filter);
  610. }
  611. void fstarpu_data_filter_set_filter_func(struct starpu_data_filter *filter, void *f_ptr)
  612. {
  613. STARPU_ASSERT(f_ptr != NULL);
  614. filter->filter_func = f_ptr;
  615. }
  616. void fstarpu_data_filter_set_nchildren(struct starpu_data_filter *filter, int nchildren)
  617. {
  618. STARPU_ASSERT(nchildren >= 0);
  619. filter->nchildren = nchildren;
  620. }
  621. void fstarpu_data_filter_set_get_nchildren_func(struct starpu_data_filter *filter, void *f_ptr)
  622. {
  623. filter->get_nchildren = f_ptr;
  624. }
  625. void fstarpu_data_filter_set_get_child_ops_func(struct starpu_data_filter *filter, void *f_ptr)
  626. {
  627. filter->get_child_ops = f_ptr;
  628. }
  629. void fstarpu_data_filter_set_filter_arg(struct starpu_data_filter *filter, int filter_arg)
  630. {
  631. STARPU_ASSERT(filter_arg >= 0); /* starpu_data_filter.filter_arg is unsigned, but
  632. * Fortran does not support unsigned types */
  633. filter->filter_arg = (unsigned)filter_arg;
  634. }
  635. void fstarpu_data_filter_set_filter_arg_ptr(struct starpu_data_filter *filter, void *filter_arg_ptr)
  636. {
  637. filter->filter_arg_ptr = filter_arg_ptr;
  638. }