1  /* { dg-do run } */
       2  
       3  #define N 128
       4  #define BS 16
       5  #define EPS 0.000001
       6  
       7  #include <stdlib.h>
       8  
       9  void matmul_depend (float A[N][N], float B[N][N], float C[N][N])
      10  {
      11     int i, j, k, ii, jj, kk;
      12     for (i = 0; i < N; i+=BS)
      13       for (j = 0; j < N; j+=BS)
      14         for (k = 0; k < N; k+=BS)
      15  // Note 1: i, j, k, A, B, C are firstprivate by default
      16  // Note 2: A, B and C are just pointers
      17  #pragma omp task private(ii, jj, kk) \
      18              depend ( in: A[i:BS][k:BS], B[k:BS][j:BS] ) \
      19              depend ( inout: C[i:BS][j:BS] )
      20              for (ii = i; ii < i+BS; ii++ )
      21                for (jj = j; jj < j+BS; jj++ )
      22                  for (kk = k; kk < k+BS; kk++ )
      23                    C[ii][jj] = C[ii][jj] + A[ii][kk] * B[kk][jj];
      24  }
      25  
      26  void matmul_ref (float A[N][N], float B[N][N], float C[N][N])
      27  {
      28     int i, j, k;
      29  
      30     for (i = 0; i < N; i++)
      31       for (j = 0; j < N; j++)
      32         for (k = 0; k < N; k++)
      33           C[i][j] += A[i][k] * B[k][j];
      34  }
      35  
      36  void init (float A[N][N], float B[N][N])
      37  {
      38    int i, j, s = -1;
      39    for (i = 0; i < N; i++)
      40      for (j = 0; j < N; j++)
      41      {
      42        A[i][j] = i * j * s;
      43        B[i][j] = i + j;
      44        s = -s;
      45      }
      46  }
      47  
      48  void init_zero (float A[N][N], float B[N][N])
      49  {
      50    int i, j, s = -1;
      51    for (i = 0; i < N; i++)
      52      for (j = 0; j < N; j++)
      53      {
      54        A[i][j] = 0;
      55        B[i][j] = 0;
      56      }
      57  }
      58  
      59  void check (float A[N][N], float B[N][N])
      60  {
      61    int i, j;
      62    for (i = 0; i < N; i++)
      63      for (j = 0; j < N; j++)
      64        if (A[i][j] - B[i][j] > EPS || B[i][j] - A[i][j] > EPS)
      65          abort ();
      66  }
      67  
      68  int main ()
      69  {
      70    float A[N][N], B[N][N], C[N][N], C_ref[N][N];
      71  
      72    init (A, B);
      73    init_zero (C, C_ref);
      74  
      75    matmul_depend (A, B, C);
      76    matmul_ref (A, B, C_ref);
      77  
      78    check (C, C_ref);
      79  
      80    return 0;
      81  }