simd-1.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // { dg-do run }
  2. // { dg-additional-options "-msse2" { target sse2_runtime } }
  3. // { dg-additional-options "-mavx" { target avx_runtime } }
  4. #define N 1024
  5. int a[N], b[N];
  6. int
  7. f1 (void)
  8. {
  9. int i;
  10. #pragma omp simd private (i)
  11. for (i = 0; i < N; i++)
  12. a[i] = b[i] * 2;
  13. #pragma omp simd lastprivate (i)
  14. for (i = 0; i < N; i++)
  15. a[i] += b[i] * 2;
  16. return i;
  17. }
  18. int
  19. f2 (void)
  20. {
  21. int i, j;
  22. #pragma omp simd private (i), collapse (2), lastprivate (j)
  23. for (i = 0; i < 32; i++)
  24. for (j = 0; j < 32; ++j)
  25. a[i * 32 + j] += b[i * 32 + j] * 2;
  26. return j;
  27. }
  28. int
  29. f3 (void)
  30. {
  31. static int i;
  32. #pragma omp for simd private (i)
  33. for (i = 0; i < N; ++i)
  34. a[i] = b[i] * 2;
  35. #pragma omp for simd lastprivate (i)
  36. for (i = 0; i < N; ++i)
  37. a[i] += b[i] * 2;
  38. return i;
  39. }
  40. int
  41. f4 (void)
  42. {
  43. static int i, j;
  44. #pragma omp for simd private (i)collapse (2)lastprivate (j)
  45. for (i = 0; i < 32; ++i)
  46. for (j = 0; j < 32; j++)
  47. a[i * 32 + j] += b[i * 32 + j] * 2;
  48. return j;
  49. }
  50. int
  51. main ()
  52. {
  53. int i;
  54. for (i = 0; i < N; ++i)
  55. a[i] = b[i] = i;
  56. if (f1 () != 1024 || f2 () != 32)
  57. __builtin_abort ();
  58. #pragma omp parallel num_threads(4)
  59. if (f3 () != 1024 || f4 () != 32)
  60. __builtin_abort ();
  61. for (i = 0; i < N; ++i)
  62. if (a[i] != 6 * i || b[i] != i)
  63. __builtin_abort ();
  64. return 0;
  65. }