exemple.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <starpu.h>
  4. static inline void my_codelet_cpu(void *descr[], void *_args)
  5. {
  6. unsigned nx = STARPU_VECTOR_GET_NX(descr[0]);
  7. float *sub = (float *)STARPU_VECTOR_GET_PTR(descr[0]);
  8. unsigned i;
  9. for(i = 0; i < nx; i++){
  10. sub[i] *= 5;
  11. }
  12. }
  13. extern void my_codelet_gpu(void *descr[], __attribute__ ((unused)) void *_args);
  14. static starpu_codelet cl =
  15. {
  16. .where = STARPU_CPU|STARPU_CUDA,
  17. .cpu_func = my_codelet_cpu,
  18. .cuda_func = my_codelet_gpu,
  19. .nbuffers = 1
  20. };
  21. void print_vect(int *vect, int size){
  22. unsigned i;
  23. for(i = 0; i < size; i++)
  24. printf("%d ", vect[i]);
  25. printf("\n");
  26. }
  27. int main(int argc, char **argv)
  28. {
  29. srand(time(NULL));
  30. int *mat;
  31. unsigned size = 20, children = 5;
  32. mat = (int *)malloc(size*sizeof(int));
  33. unsigned i;
  34. for(i = 0; i < size; i++)
  35. {
  36. mat[i] = random()% 10 + 1;
  37. }
  38. print_vect(mat, size);
  39. // struct starpu_conf conf;
  40. //conf.sched_policy_name = "heft-tm";
  41. //conf.ncpus = -1;
  42. // printf("got here \n");
  43. starpu_init(NULL);
  44. starpu_data_handle dataA;
  45. starpu_vector_data_register(&dataA, 0, (uintptr_t)mat, size, sizeof(mat[00]));
  46. struct starpu_data_filter f =
  47. {
  48. .filter_func = starpu_block_filter_func_vector,
  49. .nchildren = children,
  50. .get_nchildren = NULL,
  51. .get_child_ops = NULL
  52. };
  53. starpu_data_partition(dataA, &f);
  54. struct starpu_sched_ctx sched_ctx;
  55. int procs[] = {1, 2, 3};
  56. starpu_create_sched_ctx(&sched_ctx, "random", procs, 3);
  57. unsigned j;
  58. for(j = 0; j < children; j++){
  59. struct starpu_task *task = starpu_task_create();
  60. task->cl = &cl;
  61. task->synchronous = 1;
  62. task->callback_func = NULL;
  63. task->buffers[0].handle = starpu_data_get_sub_data(dataA, 1, j);
  64. task->buffers[0].mode = STARPU_RW;
  65. task->name = "first 1 2 3";
  66. starpu_task_submit_to_ctx(task, &sched_ctx);
  67. }
  68. int procs_to_remove[]={1,3};
  69. starpu_remove_workers_from_sched_ctx(procs_to_remove, 2, &sched_ctx);
  70. printf("procs removed \n");
  71. for(j = 0; j < children; j++){
  72. struct starpu_task *task = starpu_task_create();
  73. task->cl = &cl;
  74. task->synchronous = 1;
  75. task->callback_func = NULL;
  76. task->buffers[0].handle = starpu_data_get_sub_data(dataA, 1, j);
  77. task->buffers[0].mode = STARPU_RW;
  78. task->name = "first 2";
  79. starpu_task_submit_to_ctx(task, &sched_ctx);
  80. }
  81. int procs_to_add[]={1, 4, 5};
  82. starpu_add_workers_to_sched_ctx(procs_to_add, 2, &sched_ctx);
  83. printf("procs add \n");
  84. for(j = 0; j < children; j++){
  85. struct starpu_task *task = starpu_task_create();
  86. task->cl = &cl;
  87. task->synchronous = 1;
  88. task->callback_func = NULL;
  89. task->buffers[0].handle = starpu_data_get_sub_data(dataA, 1, j);
  90. task->buffers[0].mode = STARPU_RW;
  91. task->name = "first 1 2 4 5";
  92. starpu_task_submit_to_ctx(task, &sched_ctx);
  93. }
  94. struct starpu_sched_ctx sched_ctx2;
  95. int procs2[]={3, 4, 5, 6, 7};
  96. starpu_create_sched_ctx(&sched_ctx2, "random", procs2, 5);
  97. for(j = 0; j < children; j++){
  98. struct starpu_task *task3 = starpu_task_create();
  99. task3->cl = &cl;
  100. task3->synchronous = 1;
  101. task3->callback_func = NULL;
  102. task3->buffers[0].handle = starpu_data_get_sub_data(dataA, 1, j);
  103. task3->buffers[0].mode = STARPU_RW;
  104. task3->name = "third 3 4 5 6 7";
  105. starpu_task_submit_to_ctx(task3, &sched_ctx2);
  106. }
  107. for(j = 0; j < children; j++){
  108. struct starpu_task *task2 = starpu_task_create();
  109. task2->cl = &cl;
  110. task2->synchronous = 1;
  111. task2->callback_func = NULL;
  112. task2->buffers[0].handle = starpu_data_get_sub_data(dataA, 1, j);
  113. task2->buffers[0].mode = STARPU_RW;
  114. task2->name = "anything";
  115. starpu_task_submit(task2);
  116. }
  117. printf("wait for all \n");
  118. starpu_task_wait_for_all();
  119. starpu_data_unpartition(dataA, 0);
  120. printf("data unregister \n");
  121. starpu_data_unregister(dataA);
  122. printf("the end \n");
  123. starpu_shutdown();
  124. print_vect(mat, size);
  125. return 0;
  126. }