sched_ctx.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /* StarPU --- Runtime system for heterogeneous multicore architectures.
  2. *
  3. * Copyright (C) 2010-2012 Université de Bordeaux 1
  4. * Copyright (C) 2010-2012 Centre National de la Recherche Scientifique
  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 <pthread.h>
  19. #define NTASKS 1000
  20. int tasks_executed = 0;
  21. pthread_mutex_t mut;
  22. static void sched_ctx_func(void *descr[] __attribute__ ((unused)), void *arg __attribute__ ((unused)))
  23. {
  24. pthread_mutex_lock(&mut);
  25. tasks_executed++;
  26. pthread_mutex_unlock(&mut);
  27. }
  28. static struct starpu_codelet sched_ctx_codelet =
  29. {
  30. .where = STARPU_CPU|STARPU_CUDA|STARPU_OPENCL,
  31. .cpu_funcs = {sched_ctx_func, NULL},
  32. .cuda_funcs = {sched_ctx_func, NULL},
  33. .opencl_funcs = {sched_ctx_func, NULL},
  34. .model = NULL,
  35. .nbuffers = 0
  36. };
  37. int main(int argc, char **argv)
  38. {
  39. int ntasks = NTASKS;
  40. int ret;
  41. ret = starpu_init(NULL);
  42. if (ret == -ENODEV)
  43. return 77;
  44. STARPU_CHECK_RETURN_VALUE(ret, "starpu_init");
  45. pthread_mutex_init(&mut, NULL);
  46. int nprocs1 = 1;
  47. int nprocs2 = 1;
  48. int procs1[20], procs2[20];
  49. procs1[0] = 0;
  50. procs2[0] = 0;
  51. #ifdef STARPU_USE_CPU
  52. unsigned ncpus = starpu_cpu_worker_get_count();
  53. starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, procs1, ncpus);
  54. nprocs1 = ncpus;
  55. #endif
  56. #ifdef STARPU_USE_CUDA
  57. unsigned ncuda = starpu_cuda_worker_get_count();
  58. starpu_worker_get_ids_by_type(STARPU_CUDA_WORKER, procs2, ncuda);
  59. nprocs2 = ncuda;
  60. #endif
  61. /*create contexts however you want*/
  62. unsigned sched_ctx1 = starpu_sched_ctx_create("dmda", procs1, nprocs1, "ctx1");
  63. unsigned sched_ctx2 = starpu_sched_ctx_create("dmda", procs2, nprocs2, "ctx2");
  64. /*indicate what to do with the resources when context 2 finishes (it depends on your application)*/
  65. starpu_sched_ctx_set_inheritor(sched_ctx2, sched_ctx1);
  66. unsigned i;
  67. for (i = 0; i < ntasks/2; i++)
  68. {
  69. struct starpu_task *task = starpu_task_create();
  70. task->cl = &sched_ctx_codelet;
  71. task->cl_arg = NULL;
  72. /*submit tasks to context*/
  73. ret = starpu_task_submit_to_ctx(task,sched_ctx1);
  74. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
  75. }
  76. /* tell starpu when you finished submitting tasks to this context
  77. in order to allow moving resources from this context to the inheritor one
  78. when its corresponding tasks finished executing */
  79. #warning TODO: to be fixed
  80. starpu_sched_ctx_finished_submit(sched_ctx1);
  81. for (i = 0; i < ntasks/2; i++)
  82. {
  83. struct starpu_task *task = starpu_task_create();
  84. task->cl = &sched_ctx_codelet;
  85. task->cl_arg = NULL;
  86. ret = starpu_task_submit_to_ctx(task,sched_ctx2);
  87. STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit");
  88. }
  89. #warning TODO: to be fixed
  90. starpu_sched_ctx_finished_submit(sched_ctx2);
  91. /* wait for all tasks at the end*/
  92. starpu_task_wait_for_all();
  93. starpu_sched_ctx_delete(sched_ctx1);
  94. starpu_sched_ctx_delete(sched_ctx2);
  95. printf("tasks executed %d out of %d\n", tasks_executed, ntasks);
  96. starpu_shutdown();
  97. return 0;
  98. }