B5 - parallel for

#pragma omp parallel for
for (i = i_start; i <= i_end; inc_exp) {
	// statements
}
#pragma omp parallel for ordered
 for (i=0; i<n; i++) {
	 a[i] = costly_func(i);
	 #pragma omp ordered
	 printf("%d %f\n", i, a[i])
 }
// cannot parallelise
for (i=1; i<n; i++) {
	a[i] = a[i] = a[i-1];  // depends on previous iteration
}

// can parallelise
for (i=1; i<n; i+=2) {  // only odd indices are modified
	a[i] = a[i] = a[i-1];  // data-dependence on even (uniterated) indices
} 

last/first private

int x = 10;

#pragma omp parallel private(x)
{
    printf("Thread %d: x = %d\n",
           omp_get_thread_num(), x);
}
int x = 10;

#pragma omp parallel firstprivate(x)
{
    printf("Thread %d: x = %d\n",
           omp_get_thread_num(), x);
    x += omp_get_thread_num();
}

printf("Original x = %d\n", x);
int x = 10;

#pragma omp parallel for lastprivate(x)
for (int i = 0; i < 4; i++) {
    x = i * 10;
}

printf("x = %d\n", x);