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