simd-1.C 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // { dg-do run }
  2. // { dg-additional-options "-msse2" { target sse2_runtime } }
  3. // { dg-additional-options "-mavx" { target avx_runtime } }
  4. extern "C" void abort ();
  5. int a[1024] __attribute__((aligned (32))) = { 1 };
  6. int b[1024] __attribute__((aligned (32))) = { 1 };
  7. int k, m;
  8. struct U { U (); ~U (); int u; };
  9. struct V
  10. {
  11. V () : v (8) {}
  12. ~V ()
  13. {
  14. if (v > 38 + 4 + 3 * 1024 + 1)
  15. abort ();
  16. }
  17. V &operator= (const V &x) { v = x.v + 1; return *this; }
  18. int v;
  19. };
  20. __attribute__((noinline, noclone))
  21. U::U () : u (6)
  22. {
  23. }
  24. __attribute__((noinline, noclone))
  25. U::~U ()
  26. {
  27. if (u > 38 + 4 + 3 * 1023)
  28. abort ();
  29. }
  30. __attribute__((noinline, noclone)) int
  31. foo (int *p)
  32. {
  33. int i, s = 0;
  34. U u;
  35. V v;
  36. #pragma omp simd aligned(a, p : 32) linear(k: m + 1) \
  37. reduction(+:s) lastprivate(u, v)
  38. for (i = 0; i < 1024; i++)
  39. {
  40. a[i] *= p[i];
  41. u.u = p[i] + k;
  42. k += m + 1;
  43. v.v = p[i] + k;
  44. s += p[i] + k;
  45. }
  46. if (u.u != 36 + 4 + 3 * 1023 || v.v != 36 + 4 + 3 * 1024 + 1)
  47. abort ();
  48. return s;
  49. }
  50. int
  51. main ()
  52. {
  53. #if __SIZEOF_INT__ >= 4
  54. int i;
  55. k = 4;
  56. m = 2;
  57. for (i = 0; i < 1024; i++)
  58. {
  59. a[i] = i - 512;
  60. b[i] = (i - 51) % 39;
  61. }
  62. int s = foo (b);
  63. for (i = 0; i < 1024; i++)
  64. {
  65. if (b[i] != (i - 51) % 39
  66. || a[i] != (i - 512) * b[i])
  67. abort ();
  68. }
  69. if (k != 4 + 3 * 1024 || s != 1596127)
  70. abort ();
  71. #endif
  72. return 0;
  73. }