/*Removal of dependencies*/
// Serial version containing anti-dependency
for(int i = 0; i < n; i++){
x = (b[i] + c[i]) / 2;
a[i] = a[i + 1] + x;
}
// Parallel version with dependencies removed
#pragma omp parallel for shared(a, a_copy)
for(int i = 0; i < n; i++)
a_copy[i] + a[i + 1];
#pragma omp parallel for shared(a, a_copy) private(x)
for(int i = 0; i < n; i++){
x = (b[i] + c[i]) / 2;
a[i] = a_copy[i] + x;
}
// Serial version containing flow dependency
for(int i = 1; i < n; i++){
b[i] = b[i] + a[i - 1];
a[i] = a[i] + c[i];
}
// Parallel version with dependencies removed by loop skewing http://en.wikipedia.org/wiki/Loop_optimization
b[1] = b[1] - a[0];
#pragma omp parallel for shared(a, b, c)
for(int i = 1; i < n; i++){
a[i] = a[i] + c[i];
b[i + 1] = b[i + 1] + a[i];
}
a[n - 1] = a[n - 1] + c[n - 1];
Comments