simd-8.c 782 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /* { dg-do run } */
  2. /* { dg-additional-options "-msse2" { target sse2_runtime } } */
  3. /* { dg-additional-options "-mavx" { target avx_runtime } } */
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #define EPS 0.005
  7. int P[1000];
  8. float A[1000];
  9. float do_work(float *arr)
  10. {
  11. float pri;
  12. #pragma omp simd lastprivate(pri)
  13. for (int i = 0; i < 999; ++i)
  14. {
  15. int j = P[i];
  16. pri = 0.5f;
  17. if (j % 2 == 0)
  18. {
  19. pri = A[j+1] + arr[i];
  20. }
  21. A[j] = pri * 1.5f;
  22. pri = pri + A[j];
  23. }
  24. return pri;
  25. }
  26. int main(void)
  27. {
  28. float pri, arr[1000], diff;
  29. for (int i = 0; i < 1000; ++i)
  30. {
  31. P[i] = i;
  32. A[i] = i * 1.5f;
  33. arr[i] = i * 1.8f;
  34. }
  35. pri = do_work(&arr[0]);
  36. diff = pri - 8237.25;
  37. if (diff > EPS || -diff > EPS)
  38. abort ();
  39. return 0;
  40. }