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