max_fpga.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include <starpu.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <starpu_scheduler.h>
  5. #include "../helper.h"
  6. #include "StreamFMA.h"
  7. #include "MaxSLiCInterface.h"
  8. #define SIZE (192/sizeof(int32_t))
  9. void cpu_func(void *buffers[], void *cl_arg)
  10. {
  11. int *a = (int*) STARPU_VECTOR_GET_PTR(buffers[0]);
  12. int *b = (int*) STARPU_VECTOR_GET_PTR(buffers[1]);
  13. int *c = (int*) STARPU_VECTOR_GET_PTR(buffers[2]);
  14. int size = STARPU_VECTOR_GET_NX(buffers[0]);
  15. (void)buffers;
  16. (void)cl_arg;
  17. int i;
  18. for (i = 0; i < size; i++)
  19. c[i] = a[i] + b[i];
  20. }
  21. void fpga_impl(void *buffers[], void *cl_arg)
  22. {
  23. (void)cl_arg;
  24. int32_t *ptrA = (int32_t*) STARPU_VECTOR_GET_PTR(buffers[0]);
  25. int32_t *ptrB = (int32_t*) STARPU_VECTOR_GET_PTR(buffers[1]);
  26. int32_t *ptrC = (int32_t*) STARPU_VECTOR_GET_PTR(buffers[2]);
  27. int32_t *poubelle_cpu = malloc(SIZE * sizeof(int32_t));
  28. int size = STARPU_VECTOR_GET_NX(buffers[0]);
  29. int sizeBytes=SIZE *sizeof(int32_t);
  30. size_t LMemsize= SIZE *sizeof(int32_t);
  31. size_t poubelle = 0xc0000;
  32. size_t ptrCT1 = 0x00000000000000c0;
  33. size_t ptrAT2 = ptrCT1;
  34. size_t ptrBT2 = ptrCT1;
  35. size_t ptrCT2 = 0x0000000000000180;
  36. size_t ptrAT3 = ptrCT2;
  37. size_t ptrBT3 = ptrCT2;
  38. printf("Loading DFE memory.\n");
  39. StreamFMA(SIZE, ptrA, sizeBytes, ptrB, sizeBytes, poubelle_cpu, sizeBytes,
  40. poubelle, LMemsize,
  41. poubelle, LMemsize,
  42. poubelle, LMemsize,
  43. poubelle, LMemsize,
  44. ptrCT1, LMemsize,
  45. poubelle, LMemsize);
  46. printf("T1 finished\n");
  47. StreamFMA(SIZE, poubelle_cpu, sizeBytes, poubelle_cpu, sizeBytes, poubelle_cpu, sizeBytes,
  48. ptrAT2, LMemsize,
  49. poubelle, LMemsize,
  50. ptrBT2, LMemsize,
  51. poubelle, LMemsize,
  52. poubelle, LMemsize,
  53. ptrCT2, LMemsize);
  54. printf("T2 finished\n");
  55. StreamFMA(SIZE, poubelle_cpu, sizeBytes, poubelle_cpu, sizeBytes, ptrC, sizeBytes,
  56. poubelle, LMemsize,
  57. ptrAT3, LMemsize,
  58. poubelle, LMemsize,
  59. ptrBT3, LMemsize,
  60. poubelle, LMemsize,
  61. poubelle, LMemsize);
  62. printf("T3 finished\n");
  63. printf("Running DFE.\n");
  64. }
  65. static struct starpu_codelet cl =
  66. {
  67. .cpu_funcs = {cpu_func},
  68. .cpu_funcs_name = {"cpu_func"},
  69. .fpga_funcs = {fpga_impl},
  70. .nbuffers = 3,
  71. .modes = {STARPU_R, STARPU_R, STARPU_W}
  72. };
  73. int main(int argc, char **argv)
  74. {
  75. /* Enable profiling */
  76. starpu_profiling_status_set(1);
  77. struct starpu_conf conf;
  78. starpu_data_handle_t handle_a, handle_b, handle_c;
  79. int ret;
  80. int size=1234;
  81. starpu_conf_init(&conf);
  82. conf.sched_policy_name = "eager";
  83. conf.calibrate = 0;
  84. ret = starpu_initialize(&conf, &argc, &argv);
  85. if (ret == -ENODEV) return STARPU_TEST_SKIPPED;
  86. STARPU_CHECK_RETURN_VALUE(ret, "starpu_init");
  87. int a[SIZE];
  88. int b[SIZE];
  89. int c[SIZE];
  90. int i;
  91. for(i = 0; i < SIZE; ++i)
  92. {
  93. a[i] = random() % 100;
  94. b[i] = random() % 100;
  95. }
  96. starpu_vector_data_register(&handle_a, STARPU_MAIN_RAM, (uintptr_t) &a, SIZE, sizeof(int));
  97. starpu_vector_data_register(&handle_b, STARPU_MAIN_RAM, (uintptr_t) &b, SIZE, sizeof(int));
  98. starpu_vector_data_register(&handle_c, STARPU_MAIN_RAM, (uintptr_t) &c, SIZE, sizeof(int));
  99. struct starpu_task *task = starpu_task_create();
  100. task->cl = &cl;
  101. task->handles[0] = handle_a;
  102. task->handles[1] = handle_b;
  103. task->handles[2] = handle_c;
  104. task->synchronous = 1;
  105. task->destroy = 0;
  106. /* submit the task to StarPU */
  107. //starpu_task_destroy(task);
  108. ret = starpu_task_submit(task);
  109. fprintf(stderr,"task submitted %d\n", ret);
  110. starpu_data_unregister(handle_a);
  111. starpu_data_unregister(handle_b);
  112. starpu_data_unregister(handle_c);
  113. int mysize = SIZE;
  114. if (mysize > 10)
  115. mysize = 10;
  116. for (i = 0; i < mysize; ++i)
  117. {
  118. int ct1 = a[i] + b[i];
  119. int ct2 = ct1 * ct1;
  120. int ct3 = ct2 + ct2;
  121. printf("%d == %d\n", c[i], ct3);
  122. }
  123. starpu_shutdown();
  124. return EXIT_SUCCESS;
  125. }