(a)
 double x[N], y[N], a[N][N];
    ...
    for (i = 0; i < N; i++) {
      x[i] = 0.0;
      for (j = 0; j < N; j++) {
  S:      x[i] = x[i] + a[i][j] * y[j];
      }
    }

(b)
_fork_call(_matvec_par_loop0, N);

(c)
void _matvec_par_loop0(int tid, int n) {

  int par_i, par_j;

  int _lower  = 0;
  int _upper  = n - 1;
  int _stride = 1;

  _static_init(tid, &_lower, &_upper, &_stride);

  for (par_i = _lower; par_i <= _upper; par_i += _stride) {
     double par_xx = 0.0;
     for (par_j = 0; par_j < n; par_j++) {
       par_xx = par_xx + a[par_i][par_j] * y[par_j];
     }
     x[par_i] = par_xx;
  }

  _static_fini(tid);
}

Example 4: Auto-parallelization.

Back to Article