exemple.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. for(i = 0; i < 12; i++)
  45. printf("%d: arch is %d\n", starpu_worker_get_type(i));
  46. starpu_data_handle dataA;
  47. starpu_vector_data_register(&dataA, 0, (uintptr_t)mat, size, sizeof(mat[00]));
  48. struct starpu_data_filter f =
  49. {
  50. .filter_func = starpu_block_filter_func_vector,
  51. .nchildren = children,
  52. .get_nchildren = NULL,
  53. .get_child_ops = NULL
  54. };
  55. starpu_data_partition(dataA, &f);
  56. struct starpu_sched_ctx sched_ctx;
  57. int procs[] = {1, 2, 3};
  58. starpu_create_sched_ctx(&sched_ctx, "heft", procs, 3);
  59. unsigned j;
  60. for(j = 0; j < children; j++){
  61. struct starpu_task *task = starpu_task_create();
  62. task->cl = &cl;
  63. task->synchronous = 1;
  64. task->callback_func = NULL;
  65. task->buffers[0].handle = starpu_data_get_sub_data(dataA, 1, j);
  66. task->buffers[0].mode = STARPU_RW;
  67. task->name = "first 1 2 3";
  68. starpu_task_submit_to_ctx(task, &sched_ctx);
  69. }
  70. int procs_to_remove[]={1,3};
  71. starpu_remove_workers_from_sched_ctx(procs_to_remove, 2, &sched_ctx);
  72. printf("procs removed \n");
  73. for(j = 0; j < children; j++){
  74. struct starpu_task *task = starpu_task_create();
  75. task->cl = &cl;
  76. task->synchronous = 1;
  77. task->callback_func = NULL;
  78. task->buffers[0].handle = starpu_data_get_sub_data(dataA, 1, j);
  79. task->buffers[0].mode = STARPU_RW;
  80. task->name = "first 2";
  81. starpu_task_submit_to_ctx(task, &sched_ctx);
  82. }
  83. int procs_to_add[]={1, 4, 5};
  84. starpu_add_workers_to_sched_ctx(procs_to_add, 2, &sched_ctx);
  85. printf("procs add \n");
  86. for(j = 0; j < children; j++){
  87. struct starpu_task *task = starpu_task_create();
  88. task->cl = &cl;
  89. task->synchronous = 1;
  90. task->callback_func = NULL;
  91. task->buffers[0].handle = starpu_data_get_sub_data(dataA, 1, j);
  92. task->buffers[0].mode = STARPU_RW;
  93. task->name = "first 1 2 4 5";
  94. starpu_task_submit_to_ctx(task, &sched_ctx);
  95. }
  96. struct starpu_sched_ctx sched_ctx2;
  97. int procs2[]={3, 4, 5, 6, 7};
  98. starpu_create_sched_ctx(&sched_ctx2, "random", procs2, 5);
  99. for(j = 0; j < children; j++){
  100. struct starpu_task *task3 = starpu_task_create();
  101. task3->cl = &cl;
  102. task3->synchronous = 1;
  103. task3->callback_func = NULL;
  104. task3->buffers[0].handle = starpu_data_get_sub_data(dataA, 1, j);
  105. task3->buffers[0].mode = STARPU_RW;
  106. task3->name = "third 3 4 5 6 7";
  107. starpu_task_submit_to_ctx(task3, &sched_ctx2);
  108. }
  109. for(j = 0; j < children; j++){
  110. struct starpu_task *task2 = starpu_task_create();
  111. task2->cl = &cl;
  112. task2->synchronous = 1;
  113. task2->callback_func = NULL;
  114. task2->buffers[0].handle = starpu_data_get_sub_data(dataA, 1, j);
  115. task2->buffers[0].mode = STARPU_RW;
  116. task2->name = "anything";
  117. starpu_task_submit(task2);
  118. }
  119. printf("wait for all \n");
  120. starpu_task_wait_for_all();
  121. starpu_data_unpartition(dataA, 0);
  122. printf("data unregister \n");
  123. starpu_data_unregister(dataA);
  124. printf("the end \n");
  125. starpu_shutdown();
  126. print_vect(mat, size);
  127. return 0;
  128. }