register.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /* GCC-StarPU
  2. Copyright (C) 2011, 2012 INRIA
  3. GCC-StarPU is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. GCC-StarPU is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with GCC-StarPU. If not, see <http://www.gnu.org/licenses/>. */
  13. /* Test whether `#pragma starpu register ...' generates the right code. */
  14. /* r19465 is modifying the test to avoid calling starpu_data_register twice with the same variable, starpu now checks that the same key is not entered twice in the same hashtable */
  15. #undef NDEBUG
  16. #include <mocks.h>
  17. static void
  18. foo (void)
  19. {
  20. int x[] = { 1, 2, 3 };
  21. expected_register_arguments.pointer = x;
  22. expected_register_arguments.elements = sizeof x / sizeof x[0];
  23. expected_register_arguments.element_size = sizeof x[0];
  24. #pragma starpu register x /* (warning "considered unsafe") */
  25. }
  26. #if 0
  27. static void
  28. bar (float *p, int s)
  29. {
  30. expected_register_arguments.pointer = p;
  31. expected_register_arguments.elements = s;
  32. expected_register_arguments.element_size = sizeof *p;
  33. #pragma starpu register p s
  34. }
  35. /* Same as above, but with arguments reversed, to make sure using S doesn't
  36. mutate the parameter list. */
  37. static void
  38. baz (int s, float *p)
  39. {
  40. expected_register_arguments.pointer = p;
  41. expected_register_arguments.elements = s;
  42. expected_register_arguments.element_size = sizeof *p;
  43. #pragma starpu register p s
  44. }
  45. #endif
  46. /* Check the interaction between `register' and `heap_allocated'. This test
  47. assumes `heap_allocated' works as expected. */
  48. static void
  49. heap_alloc (int x, int y)
  50. {
  51. data_register_calls = data_unregister_calls = 0;
  52. expected_malloc_argument = x * y * sizeof (float);
  53. float m[x][y] __attribute__ ((heap_allocated));
  54. expected_register_arguments.pointer = m;
  55. expected_register_arguments.elements = x;
  56. expected_register_arguments.element_size = y * sizeof m[0][0];
  57. #pragma starpu register m
  58. expected_unregister_arguments.pointer = m;
  59. #pragma starpu unregister m
  60. assert (data_register_calls == 1);
  61. assert (data_unregister_calls == 1);
  62. expected_free_argument = m;
  63. }
  64. int
  65. main (int argc, char *argv[])
  66. {
  67. #pragma starpu initialize
  68. int x[123];
  69. double *y;
  70. double *yy;
  71. static char z[345];
  72. static float m[7][42];
  73. static float m3d[14][11][80];
  74. short w[] = { 1, 2, 3 };
  75. size_t y_size = 234;
  76. y = malloc (234 * sizeof *y);
  77. yy = malloc (234 * sizeof *yy);
  78. expected_register_arguments.pointer = x;
  79. expected_register_arguments.elements = 123;
  80. expected_register_arguments.element_size = sizeof x[0];
  81. #pragma starpu register x 123 /* (note "can be omitted") */
  82. expected_register_arguments.pointer = y;
  83. expected_register_arguments.elements = 234;
  84. expected_register_arguments.element_size = sizeof *y;
  85. #pragma starpu register y 234
  86. expected_register_arguments.pointer = yy;
  87. expected_register_arguments.elements = y_size;
  88. expected_register_arguments.element_size = sizeof *yy;
  89. #pragma starpu register yy y_size
  90. expected_register_arguments.pointer = z;
  91. expected_register_arguments.elements = 345;
  92. expected_register_arguments.element_size = sizeof z[0];
  93. #pragma starpu register z
  94. expected_register_arguments.pointer = w;
  95. expected_register_arguments.elements = 3;
  96. expected_register_arguments.element_size = sizeof w[0];
  97. #pragma starpu register w
  98. expected_register_arguments.pointer = argv;
  99. expected_register_arguments.elements = 456;
  100. expected_register_arguments.element_size = sizeof argv[0];
  101. #pragma starpu register argv 456
  102. #if 0
  103. #define ARGV argv
  104. #define N 456
  105. expected_register_arguments.pointer = argv;
  106. expected_register_arguments.elements = N;
  107. expected_register_arguments.element_size = sizeof argv[0];
  108. #pragma starpu register ARGV /* hello, world! */ N
  109. #undef ARGV
  110. #undef N
  111. #endif
  112. foo ();
  113. // bar ((float *) argv, argc);
  114. // baz (argc, (float *) argv);
  115. #if 0
  116. expected_register_arguments.pointer = argv;
  117. expected_register_arguments.elements = argc;
  118. expected_register_arguments.element_size = sizeof argv[0];
  119. int chbouib = argc;
  120. #pragma starpu register argv chbouib
  121. #endif
  122. expected_register_arguments.pointer = &argv[1];
  123. expected_register_arguments.elements = 3;
  124. expected_register_arguments.element_size = sizeof argv[0];
  125. #pragma starpu register &argv[1] 3
  126. expected_register_arguments.pointer = &argv[argc + 3 / 2];
  127. expected_register_arguments.elements = argc * 4;
  128. expected_register_arguments.element_size = sizeof argv[0];
  129. #pragma starpu register &argv[argc + 3 / 2] (argc * 4)
  130. expected_register_arguments.pointer = &y[y_size / 2];
  131. expected_register_arguments.elements = (y_size / 2 - 7);
  132. expected_register_arguments.element_size = sizeof y[0];
  133. #pragma starpu register &y[y_size / 2] (y_size / 2 - 7)
  134. expected_register_arguments.pointer = m[6];
  135. expected_register_arguments.elements = 42;
  136. expected_register_arguments.element_size = sizeof m[0][0];
  137. #pragma starpu register m[6]
  138. expected_register_arguments.pointer = m;
  139. expected_register_arguments.elements = 7;
  140. expected_register_arguments.element_size = sizeof m[0];
  141. #pragma starpu register m
  142. expected_register_arguments.pointer = m3d;
  143. expected_register_arguments.elements = 14;
  144. expected_register_arguments.element_size = sizeof m3d[0];
  145. #pragma starpu register m3d
  146. #if 0
  147. assert (data_register_calls == 17);
  148. #else
  149. assert (data_register_calls == 13);
  150. #endif
  151. free (y);
  152. free (yy);
  153. heap_alloc (42, 77);
  154. assert (free_calls == 1);
  155. return EXIT_SUCCESS;
  156. }