exemple.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include <starpu.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. #include <malloc.h>
  5. static inline void my_codelet(void *descr[], void *_args)
  6. {
  7. unsigned nx = STARPU_VECTOR_GET_NX(descr[0]);
  8. float *sub = (float *)STARPU_VECTOR_GET_PTR(descr[0]);
  9. unsigned i;
  10. for(i = 0; i < nx; i++){
  11. sub[i] *= 5;
  12. }
  13. }
  14. static starpu_codelet cl =
  15. {
  16. .where = STARPU_CPU,
  17. .cpu_func = my_codelet,
  18. .nbuffers = 1
  19. };
  20. void print_vect(float *vect, int size){
  21. unsigned i;
  22. for(i = 0; i < size; i++)
  23. printf("%4.1f ", vect[i]);
  24. printf("\n");
  25. }
  26. int main(int argc, char **argv)
  27. {
  28. srand(time(NULL));
  29. float *mat;
  30. unsigned size = 20, children = 5;
  31. mat = malloc(size*sizeof(float));
  32. unsigned i;
  33. for(i = 0; i < size; i++)
  34. {
  35. mat[i] = random()% 10 + 1;
  36. }
  37. print_vect(mat, size);
  38. // struct starpu_conf conf;
  39. //conf.sched_policy_name = "heft-tm";
  40. //conf.ncpus = -1;
  41. // printf("got here \n");
  42. starpu_init(NULL);
  43. starpu_data_handle dataA;
  44. starpu_vector_data_register(&dataA, 0, (uintptr_t)mat, size, sizeof(float));
  45. starpu_data_set_sequential_consistency_flag(dataA, 0);
  46. struct starpu_data_filter f;
  47. f.filter_func = starpu_vector_list_filter_func;
  48. f.nchildren = children;
  49. f.get_nchildren = NULL;
  50. f.get_child_ops = NULL;
  51. int len[] = {4, 4, 4, 4, 4};
  52. f.filter_arg_ptr = len;
  53. starpu_data_partition(dataA, &f);
  54. starpu_data_map_filters(dataA, 1, &f);
  55. struct starpu_sched_ctx sched_ctx;
  56. int procs[]={1, 2, 3};
  57. starpu_create_sched_ctx(&sched_ctx, "random", procs, 3);
  58. struct starpu_task *task = starpu_task_create();
  59. task->cl = &cl;
  60. task->buffers[0].handle = starpu_data_get_sub_data(dataA, 0);
  61. task->buffers[0].mode = STARPU_R;
  62. task->name = "first 1 2 3";
  63. starpu_task_submit_to_ctx(task, &sched_ctx);
  64. struct starpu_sched_ctx sched_ctx2;
  65. int procs2[]={3, 4, 5, 6, 7};
  66. starpu_create_sched_ctx(&sched_ctx2, "random", procs2, 5);
  67. struct starpu_task *task3 = starpu_task_create();
  68. task3->cl = &cl;
  69. task3->buffers[0].handle = starpu_data_get_sub_data(dataA, 0);
  70. task3->buffers[0].mode = STARPU_R;
  71. task3->name = "third 3 4 5 6 7";
  72. starpu_task_submit_to_ctx(task3, &sched_ctx2);
  73. struct starpu_task *task2 = starpu_task_create();
  74. task2->cl = &cl;
  75. task2->buffers[0].handle = starpu_data_get_sub_data(dataA, 0);
  76. task2->buffers[0].mode = STARPU_R;
  77. task2->name = "anything";
  78. starpu_task_submit(task2);
  79. starpu_task_wait_for_all();
  80. starpu_data_unpartition(dataA, 0);
  81. starpu_data_unregister(dataA);
  82. starpu_shutdown();
  83. print_vect(mat, size);
  84. return 0;
  85. }