Paraleliza como cuando puedas

  1. ¿Se puede paralelizar este bucle añadiendo una directiva de OpenMP? Si es así, hazlo.
void func(double x[], double a, int n)
{
   int i;
   double b;
   for (i=1; i<n; i++) {
      b=a*x[i]+x[i-1];
      x[i]=b;
   }
}

Solución: No se puede. En cada iteración se tiene como salida x[i], que es dato de entrada de la siguiente iteración (dependencia de flujo).


  1. ¿Se puede paralelizar este bucle añadiendo una directiva de OpenMP? Si es así, hazlo.
void func(double x[], double y[], double a, int n)
{
   int i; 
   double b;
   for (i=1; i<n; i++) {
      b=a*x[i]+x[i-1];
      y[i]=b;
   }
}

Solución: Sí se puede, añadiendo la siguiente directiva justo antes del bucle for:

#pragma omp parallel for private(b)