register.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /* GCC-StarPU
  2. Copyright (C) 2011, 2012 Institut National de Recherche en Informatique et Automatique
  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. #undef NDEBUG
  15. #include <mocks.h>
  16. static void
  17. foo (void)
  18. {
  19. int x[] = { 1, 2, 3 };
  20. expected_register_arguments.pointer = x;
  21. expected_register_arguments.elements = sizeof x / sizeof x[0];
  22. expected_register_arguments.element_size = sizeof x[0];
  23. #pragma starpu register x /* (warning "considered unsafe") */
  24. }
  25. static void
  26. bar (float *p, int s)
  27. {
  28. expected_register_arguments.pointer = p;
  29. expected_register_arguments.elements = s;
  30. expected_register_arguments.element_size = sizeof *p;
  31. #pragma starpu register p s
  32. }
  33. /* Same as above, but with arguments reversed, to make sure using S doesn't
  34. mutate the parameter list. */
  35. static void
  36. baz (int s, float *p)
  37. {
  38. expected_register_arguments.pointer = p;
  39. expected_register_arguments.elements = s;
  40. expected_register_arguments.element_size = sizeof *p;
  41. #pragma starpu register p s
  42. }
  43. int
  44. main (int argc, char *argv[])
  45. {
  46. #pragma starpu initialize
  47. int x[123];
  48. double *y;
  49. static char z[345];
  50. static float m[7][42];
  51. static float m3d[14][11][80];
  52. short w[] = { 1, 2, 3 };
  53. size_t y_size = 234;
  54. y = malloc (234 * sizeof *y);
  55. expected_register_arguments.pointer = x;
  56. expected_register_arguments.elements = 123;
  57. expected_register_arguments.element_size = sizeof x[0];
  58. #pragma starpu register x 123 /* (note "can be omitted") */
  59. expected_register_arguments.pointer = y;
  60. expected_register_arguments.elements = 234;
  61. expected_register_arguments.element_size = sizeof *y;
  62. #pragma starpu register y 234
  63. expected_register_arguments.pointer = y;
  64. expected_register_arguments.elements = y_size;
  65. expected_register_arguments.element_size = sizeof *y;
  66. #pragma starpu register y y_size
  67. expected_register_arguments.pointer = z;
  68. expected_register_arguments.elements = 345;
  69. expected_register_arguments.element_size = sizeof z[0];
  70. #pragma starpu register z
  71. expected_register_arguments.pointer = w;
  72. expected_register_arguments.elements = 3;
  73. expected_register_arguments.element_size = sizeof w[0];
  74. #pragma starpu register w
  75. expected_register_arguments.pointer = argv;
  76. expected_register_arguments.elements = 456;
  77. expected_register_arguments.element_size = sizeof argv[0];
  78. #pragma starpu register argv 456
  79. #define ARGV argv
  80. #define N 456
  81. expected_register_arguments.pointer = argv;
  82. expected_register_arguments.elements = N;
  83. expected_register_arguments.element_size = sizeof argv[0];
  84. #pragma starpu register ARGV /* hello, world! */ N
  85. #undef ARGV
  86. #undef N
  87. foo ();
  88. bar ((float *) argv, argc);
  89. baz (argc, (float *) argv);
  90. expected_register_arguments.pointer = argv;
  91. expected_register_arguments.elements = argc;
  92. expected_register_arguments.element_size = sizeof argv[0];
  93. int chbouib = argc;
  94. #pragma starpu register argv chbouib
  95. expected_register_arguments.pointer = &argv[2];
  96. expected_register_arguments.elements = 3;
  97. expected_register_arguments.element_size = sizeof argv[0];
  98. #pragma starpu register &argv[2] 3
  99. expected_register_arguments.pointer = &argv[argc + 3 / 2];
  100. expected_register_arguments.elements = argc * 4;
  101. expected_register_arguments.element_size = sizeof argv[0];
  102. #pragma starpu register &argv[argc + 3 / 2] (argc * 4)
  103. expected_register_arguments.pointer = &y[y_size / 2];
  104. expected_register_arguments.elements = (y_size / 2 - 7);
  105. expected_register_arguments.element_size = sizeof y[0];
  106. #pragma starpu register &y[y_size / 2] (y_size / 2 - 7)
  107. expected_register_arguments.pointer = m[6];
  108. expected_register_arguments.elements = 42;
  109. expected_register_arguments.element_size = sizeof m[0][0];
  110. #pragma starpu register m[6]
  111. expected_register_arguments.pointer = m;
  112. expected_register_arguments.elements = 7;
  113. expected_register_arguments.element_size = sizeof m[0];
  114. #pragma starpu register m
  115. expected_register_arguments.pointer = m3d;
  116. expected_register_arguments.elements = 14;
  117. expected_register_arguments.element_size = sizeof m3d[0];
  118. #pragma starpu register m3d
  119. assert (data_register_calls == 17);
  120. free (y);
  121. return EXIT_SUCCESS;
  122. }