exemple.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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 block_id[children];
  58. unsigned j;
  59. for(j = 0; j < children; j++){
  60. block_id[j] = 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. struct starpu_sched_ctx sched_ctx2;
  71. int procs2[]={3, 4, 5, 6, 7};
  72. starpu_create_sched_ctx(&sched_ctx2, "random", procs2, 5);
  73. for(j = 0; j < children; j++){
  74. struct starpu_task *task3 = starpu_task_create();
  75. task3->cl = &cl;
  76. task3->synchronous = 1;
  77. task3->callback_func = NULL;
  78. task3->buffers[0].handle = starpu_data_get_sub_data(dataA, 1, j);
  79. task3->buffers[0].mode = STARPU_RW;
  80. task3->name = "third 3 4 5 6 7";
  81. starpu_task_submit_to_ctx(task3, &sched_ctx2);
  82. }
  83. for(j = 0; j < children; j++){
  84. struct starpu_task *task2 = starpu_task_create();
  85. task2->cl = &cl;
  86. task2->synchronous = 1;
  87. task2->callback_func = NULL;
  88. task2->buffers[0].handle = starpu_data_get_sub_data(dataA, 1, j);
  89. task2->buffers[0].mode = STARPU_RW;
  90. task2->name = "anything";
  91. starpu_task_submit(task2);
  92. }
  93. printf("wait for all \n");
  94. starpu_task_wait_for_all();
  95. starpu_data_unpartition(dataA, 0);
  96. printf("data unregister \n");
  97. starpu_data_unregister(dataA);
  98. printf("the end \n");
  99. starpu_shutdown();
  100. print_vect(mat, size);
  101. return 0;
  102. }