(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