/*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];