simd-2.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /* { dg-do run { target vect_simd_clones } } */
  2. /* { dg-additional-options "-msse2" { target sse2_runtime } } */
  3. /* { dg-additional-options "-mavx" { target avx_runtime } } */
  4. #define N 100
  5. #define EPS 0.0000000000000001
  6. #include <stdlib.h>
  7. void init(double *a, double *a_ref, double *b, int n)
  8. {
  9. int i;
  10. for ( i=0; i<N; i++ )
  11. {
  12. a[i] = i;
  13. a_ref[i] = i;
  14. b[i] = N-i;
  15. }
  16. }
  17. #pragma omp declare simd uniform(fact)
  18. double add1(double a, double b, double fact)
  19. {
  20. double c;
  21. c = a + b + fact;
  22. return c;
  23. }
  24. #pragma omp declare simd uniform(a,b,fact) linear(i:1)
  25. double add2(double *a, double *b, int i, double fact)
  26. {
  27. double c;
  28. c = a[i] + b[i] + fact;
  29. return c;
  30. }
  31. #pragma omp declare simd uniform(fact) linear(a,b:1)
  32. double add3(double *a, double *b, double fact)
  33. {
  34. double c;
  35. c = *a + *b + fact;
  36. return c;
  37. }
  38. void work( double *a, double *b, int n )
  39. {
  40. int i;
  41. double tmp;
  42. #pragma omp simd private(tmp)
  43. for ( i = 0; i < n; i++ ) {
  44. tmp = add1( a[i], b[i], 1.0);
  45. a[i] = add2( a, b, i, 1.0) + tmp;
  46. a[i] = add3(&a[i], &b[i], 1.0);
  47. }
  48. }
  49. void work_ref( double *a, double *b, int n )
  50. {
  51. int i;
  52. double tmp;
  53. for ( i = 0; i < n; i++ ) {
  54. tmp = add1( a[i], b[i], 1.0);
  55. a[i] = add2( a, b, i, 1.0) + tmp;
  56. a[i] = add3(&a[i], &b[i], 1.0);
  57. }
  58. }
  59. void check (double *a, double *b)
  60. {
  61. int i;
  62. for (i = 0; i < N; i++)
  63. if (a[i] - b[i] > EPS || b[i] - a[i] > EPS)
  64. abort ();
  65. }
  66. int main ()
  67. {
  68. int i;
  69. double a[N], a_ref[N], b[N];
  70. init(a, a_ref, b, N);
  71. work(a, b, N );
  72. work_ref(a_ref, b, N );
  73. check(a, a_ref);
  74. return 0;
  75. }